Невозможно получить доступ к некоторым функциям и переменным внутри WebWorker - PullRequest
1 голос
/ 05 марта 2020

У меня проблема с вызовом функции из main внутри веб-работника, который я создал. Я создал объект, похожий на enum на Java языке:

const states = {
    START: 'start',
    ADDCHAR: 'addchar',
    WORDBEFORE: 'wordbefore',
    REMOVECHAR: 'removechar',
    RESET: 'reset'
  }

И каждый элемент имеет состояние, которое я использую в следующем коде:

  self.addEventListener('message', function(e) {
  while( true ){
      switch ( state ){
          case states.START: 
                              start();
                              state = states.ADDCHAR;

          case states.ADDCHAR:
                              addchar();
                              state = states.WORDBEFORE;

          case states.WORDBEFORE:
                              sleep(3000);
                state = states.REMOVECHAR;

          case states.REMOVECHAR:
                              removeChar();
                              state = states.RESET; 
          case states.RESET:
                              reset();
                state = states.START;
      }
      sleep(1000);
  }
});

Проблема в том, что я не может получить доступ к функциям из основного: start(), addchar() et c.

Как я могу получить доступ к этим функциям внутри веб-работника? Я отправляю сообщения от основного веб-работнику, но это не работает, чтобы установить «соединение» с веб-работником с основным (и все же отправка сообщений не решает все мои проблемы, потому что я должен вызывать определенные функции c от основного внутри оператора switch).

Я пробовал многочисленные модификации кода, но не смог заставить его работать.

1 Ответ

1 голос
/ 05 марта 2020

Функции и глобальные переменные в области действия скриптов JavaScript, загруженных в окне браузера, недоступны веб-работнику.

Вы можете использовать importScripts для их импорта вашему работнику.

Цитирование из документации в MDN :

Рабочие потоки имеют доступ к глобальной функции importScripts (), которая позволяет им импортировать сценарии. Он принимает ноль или более URI в качестве параметров для ресурсов для импорта; все следующие примеры действительны:

importScripts();                         /* imports nothing */
importScripts('foo.js');                 /* imports just "foo.js" */
importScripts('foo.js', 'bar.js');       /* imports two scripts */
importScripts('//example.com/hello.js'); /* You can import scripts from other origins */
...