Нерест общего работника в преданном работнике

Я играю с WebWorkers. Каким-то образом у меня возникла идея сообщить различным экземплярам страницы, когда закрывается другой. Поэтому я написал Shared Worker, и он отлично работает.

Но теперь я хочу, чтобы Выделенный работник действовал как интерфейс для Общего работника. Таким образом, дорогостоящие действия в пользовательском интерфейсе не повлияют на постоянную связь с Shared Worker. Но я получаю ошибку, SharedWorker не был определен. Идея состоит в том, чтобы использовать MessageChannel, но я хочу, чтобы он работал по крайней мере в Firefox и Chrome, и, насколько я знаю, Firefox до сих пор не имеет работающей реализации MessageChannel.

Итак, есть ли обходные пути для этой проблемы?

1 ответ

Решение

Вы не можете создать общий рабочий объект в выделенном рабочем. Однако вы можете создать общего работника в главном потоке пользовательского интерфейса и передать его порт выделенному работнику, чтобы они могли напрямую общаться.

Как пример, в главном потоке создаем как рабочих, так и переносим port Объект общего доступа к выделенному:

var sharedWorker = new SharedWorker("worker-shared.js");
sharedWorker.port.start();

var dedicatedWorker = new Worker("worker-dedicated.js");
dedicatedWorker.postMessage({sharedWorkerPort: sharedWorker.port}, [sharedWorker.port]);

В общем работнике вы можете отправлять сообщения на этот порт:

self.onconnect = function(e) {
  var port = e.ports[0];

  self.setInterval(function() {
    port.postMessage('sent from shared worker');
  }, 1000);
};

И в выделенном вы можете реагировать на них

self.onmessage = function(e) {
  var sharedWorkerPort = e.data.sharedWorkerPort;
  sharedWorkerPort.onmessage = function(e) {
    console.log('received in dedicated worker', e.data);
  };
};

Вы можете увидеть это на http://plnkr.co/edit/ljWnL7iMiCMtL92lPIAm?p=preview

Другие вопросы по тегам