在专用 Worker 中生成共享 Worker

Spawning a Shared Worker in a Dedicated Worker

我正在研究 WebWorkers。不知何故,我有了让一个页面的不同实例知道另一个页面何时关闭的想法。因此,我写了一个 Shared Worker,它工作正常。

但现在我想要一个 Dedicated Worker 作为 Shared Worker 的接口。因此 UI 中的昂贵操作不会影响与 Shared Worker 的持续通信。 但是我收到错误消息,未定义 SharedWorker。一个想法是使用 MessageChannel,但我希望它至少在 Firefox 和 Chrome 中 运行,据我所知,Firefox 仍然没有 MessageChannel 的有效实现。

那么 - 这个问题有什么解决方法吗?

您不能在专用工作器中创建共享工作器对象。但是,您可以在主 UI 线程中创建一个共享 worker 并将其端口传递给专用 worker,以便它们可以直接通信。

例如,在主线程中创建两个worker,并将共享的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]);

在共享工作器中,您可以在此端口上 post 消息:

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

看到这个工作