Нерест общего работника в преданном работнике
Я играю с 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