Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Web Workers и видимость функций (https://javascript.ru/forum/misc/16840-web-workers-i-vidimost-funkcijj.html)

FINoM 25.04.2011 03:48

Web Workers и видимость функций
 
Как в воркере обеспечить видимость глобальных функций, не относящихся к этому воркеру (т. е. созданных в основном потоке)?
P. S. Передача воркеру объекта window генерирует исключение

UPD
Я не сильно надеюсь на ответ, так как сабж еще малоизвестен. Мне нужно каким-то образом подключить библиотеку (http://www.leemon.com/crypto/BigInt.js), но не могу ее просто импортировать в поток, так как там куча глобальных переменных. Пытаюсь аяксом обращаться к js файлу и применить функцию eval, но почему-то это не срабатывает. Уже пробовал
eval('(function(){'+this.responseText+'})()'); //и так
eval('('+this.responseText+')'); //и так
Пока что пытаюсь это сделать в контексте window, но функции не видны. Что я делаю не правильно?

monolithed 25.04.2011 08:38

лучше код (каркас) приведите того что вам нужно в итоге....
и наверное стоит обратить внимание на замыкания

FINoM 25.04.2011 23:18

monolithed, Workers очень специфичная вещь, передавая объект с набором функций, воркер не видит их. Он их видит, как пустые объекты.
Цитата:

Сообщение от monolithed
лучше код (каркас) приведите того что вам нужно в итоге....

Тут собсно всё просто:

main.js:
var obj = {f: function(){return 'ok';}}
var worker = new Worker('worker.js');
worker.postMessage(obj);

worker.onmessage = function(e){
  console.log(e.data);
};


worker.js:
onmessage = function(e){
  postMessage(e.data.f()); //TypeError: object is not a function
}

Нужно каким-то образом заставить видеть воркер функции, которые я передаю. Нашел костыль, который запускаем в воркере:
importScripts('BigInt.js'); //подобие include
Так можно импортировать библиотеку, но вот как можно импортировать функцию или набор функций или функции, которые были созданы в главном потоке без создания еще одного файла — хз.

x-yuri 28.04.2011 08:08

функции не обязательно внутрь подключать, их можно через postMessage использовать, как вариант. В случае библиотеки лучше импортировать ее с помощью importScripts, в чем здесь костыль - непонятно

FINoM 28.04.2011 15:39

Цитата:

Сообщение от x-yuri
их можно через postMessage использов

Не получается. Функции передаются как пустой объект.

Kolyaj 28.04.2011 17:05

Конечно, postMessage передаёт только строки.

x-yuri 28.04.2011 23:36

Цитата:

Сообщение от FINoM
Не получается. Функции передаются как пустой объект.

я не говорю о передаче фукций, я говорю об использовании postMessage как способа вызова функций в другом потоке

FINoM 29.04.2011 02:17

Цитата:

Сообщение от Kolyaj
Конечно, postMessage передаёт только строки.

Он передает всё, кроме функций.
Цитата:

Сообщение от x-yuri
я не говорю о передаче фукций, я говорю об использовании postMessage как способа вызова функций в другом потоке

Это уже точно костыль (отталкиваясь от первого поста в теме). Поигравшись немного с "importScripts" уже привык, так что пофиг.

x-yuri 30.04.2011 07:47

для импорта js-файлов - костыль, но ты же говорил про импорт отдельных функций, так что может пригодится, теоретически...

FINoM 30.04.2011 22:07

Цитата:

Сообщение от x-yuri
но ты же говорил про импорт отдельных функций

Я говорю про импорт а не про запуск по команде из postMessage

x-yuri 01.05.2011 07:53

я тебя не понимаю. Ты хочешь чтобы я не задумывался, в чем заключается твоя проблема, а тупо отвечал на конкретные вопросы? Это не ко мне ;)

Ты сказал, что тебе нужно подключить библиотеку. Специально для этого есть importScripts.

Ты хочешь, чтобы функции передавались? И что, вместе с ней все ее лексическое окружение?

если хочешь дельные советы, приведи какой-нибудь конкретный пример

FINoM 01.05.2011 11:38

Цитата:

Сообщение от x-yuri
приведи какой-нибудь конкретный пример

Привел выше

x-yuri 02.05.2011 15:14

ты привел абстрактный пример: непонятно, что ты хочешь вынести в отдельный поток и что за функции ты в него хочешь импортировать

FINoM 03.05.2011 02:46

Цитата:

Сообщение от x-yuri
непонятно, что ты хочешь вынести в отдельный поток и что за функции ты в него хочешь импортировать

Прикалываешься? Мне нужно импортировать в отдельный поток ряд функций, не создавая при этом новый файл.

x-yuri 03.05.2011 03:11

нет, не прикалываюсь, решение задачи зависит от контекста, а контекст ты не указал

FINoM 12.05.2011 00:19

C удивлением обнаружил, что воркеры не работают локально, без веб сервера, значение всех экземпляров воркера — undefined. Может кто знает, как это обойти? Адрес вида "file:///..." не катит.

x-yuri 12.05.2011 18:18

оно?

FINoM 13.05.2011 02:42

x-yuri, да, спасибо. Жаль, что некоторые (или многие) нововведения слегка через жопу сделаны. Не понимаю я, зачем эти ограничения.

x-yuri 13.05.2011 12:38

не говори "через жопу", пока не понимаешь ;)

FINoM 14.05.2011 04:37

Цитата:

Сообщение от x-yuri
не говори "через жопу", пока не понимаешь

Ну вот например, localstorage может хранить только атомарные элементы, хотя спецификация, насколько мне известно, предполагает еще и хранение объектов.

x-yuri 14.05.2011 08:54

я уверен, что изначально речь шла только о строках, например, потому что в dive into html говорится о строках. Но заметь, что даже сейчас речь не идет о хранении, например, методов обьектов. Или ты считаешь, что методы вместе с DOM-объектами тоже надо хранить?

И не стоит забывать, что спецификация постепенно изменяется. Но тут ничего не поделаешь:
Цитата:

Сообщение от Dive Into HTML5
Implementations and specifications have to do a delicate dance together. You don’t want implementations to happen before the specification is finished, because people start depending on the details of implementations and that constrains the specification. However, you also don’t want the specification to be finished before there are implementations and author experience with those implementations, because you need the feedback. There is unavoidable tension here, but we just have to muddle on through.


x-yuri 14.05.2011 09:18

...собственно вот

FINoM 15.05.2011 01:54

Цитата:

Сообщение от x-yuri
Или ты считаешь, что методы вместе с DOM-объектами тоже надо хранить?

Просто объектов будет достаточно. Хотя, исходя из моих скромных знаний, я не могу найти причин запрета на хранение DOM элементов и методов.

x-yuri 15.05.2011 13:13

во-первых, зачем хранить код, если можно обьект из данных воссоздать. Во-вторых, каждый метод привязан к лексическому конексту:
var a = 2, b = 3;
function f(c){ return b + window[c] + document.getElementById('d').value; }

т.е. это что же получается, все текущее состояние окна надо вместе с методом сохранять?

FINoM 15.05.2011 21:24

Цитата:

Сообщение от x-yuri
т.е. это что же получается, все текущее состояние окна надо вместе с методом сохранять?

Запретить инкапсуляцию, например?

x-yuri 15.05.2011 22:24

в смысле? Сохранять методы, игнорируя то, что они привязаны к каким-то переменным? Так оно же работать тогда не будет. В данном случае эффективнее переложить ответственность за преобразование в строку на сам обьект, а не придумывать какое-либо универсальное решение. В случае, например, с eval, который зависит от входных параметров, я не вижу способа отследить используемые переменные. Т.е. при каждом сохранении надо делать полный снимок состояния всех окон, к которым имеется доступ. Но к счастью это не нужно, потому что не сложно написать метод, сериализующий обьект в строку

FINoM 16.05.2011 04:38

Цитата:

Сообщение от x-yuri
Так оно же работать тогда не будет.

Ну так поставить такое требование в спецификации, проблем не будет. А инкапсулируемые переменные делать undefined.

Это ладно, с методами вопрос спорный, но вот отсутствие в реализациях хранения объектов — бред.

x-yuri 16.05.2011 11:49

Цитата:

Сообщение от FINoM
Ну так поставить такое требование в спецификации, проблем не будет. А инкапсулируемые переменные делать undefined.

а как сделать инкапсулируемую переменную undefined? При восстановлении обьекта надо создать глобальную переменную с соответствующим именем и значением undefined? Или исправить код метода?

Цитата:

Сообщение от FINoM
Это ладно, с методами вопрос спорный, но вот отсутствие в реализациях хранения объектов — бред.

т.е. то, что реализации соответствуют спецификации, хоть и более старой - это бред? Тогда у тебя наверное есть идеи, как лучше решить эту проблему с браузерами и стандартами. И в конце концов, разве так сложно преобразовать обьект в строку самому?

FINoM 16.05.2011 20:37

Цитата:

Сообщение от x-yuri
а как сделать инкапсулируемую переменную undefined?

Просто забивать на переменные, переданные извне (использовать только локальные).
Цитата:

Сообщение от x-yuri
Тогда у тебя наверное есть идеи, как лучше решить эту проблему с браузерами и стандартами.

Да, у меня есть идеи: добавление возможности хранения объектов никоим образом не повлияет на приложения, которые уже используют localstorage.
Цитата:

Сообщение от x-yuri
И в конце концов, разве так сложно преобразовать обьект в строку самому?

Меня смущает одно: вот у меня есть сравнительно крупная база данных (http://www.google.com/fusiontables/D...?dsrcid=850777), её нужно сохранить локально, хватит ли места в строке?

x-yuri 16.05.2011 21:10

Цитата:

Сообщение от FINoM
Просто забивать на переменные, переданные извне (использовать только локальные).

ну так работать же не будет. Причем местами тебе надо будет учитывать, что переменная может быть недоступна. Т.е. вместо того чтобы самому сериализовать обьекты, ты хочешь создать себе ненужные проблемы

Цитата:

Сообщение от FINoM
Да, у меня есть идеи: добавление возможности хранения объектов никоим образом не повлияет на приложения, которые уже используют localstorage.

ну я говорил про другие проблемы. А с этой проблемой да, ничего не должно поломаться. Но только необходимости в этой большой нету. Есть вопросы по-важнее.

Цитата:

Сообщение от FINoM
Меня смущает одно: вот у меня есть сравнительно крупная база данных (http://www.google.com/fusiontables/D...?dsrcid=850777), её нужно сохранить локально, хватит ли места в строке?

судя по той же ссылке, у тебя есть минимум 5МБ. А БД у тебя небольшая, не вижу проблем

FINoM 16.05.2011 23:56

Цитата:

Сообщение от x-yuri
судя по той же ссылке, у тебя есть минимум 5МБ. А БД у тебя небольшая, не вижу проблем

Ну я же буду хранить одну большую JSON строку, вопрос в максимальном размере строки и в максимальном объеме данных, хранимых под одним ключем.

x-yuri 17.05.2011 16:48

но ты же будешь только данные хранить, а суммарный обьем как минимум 5МБ, ну там написано по ссылке. В конце концов, это самому не сложно выяснить


Часовой пояс GMT +3, время: 01:16.