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


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