【问题标题】:Spawning a Shared Worker in a Dedicated Worker在 Dedicated Worker 中生成 Shared Worker
【发布时间】:2015-06-12 13:50:27
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以使用storage 事件从一个选项卡与同一域中的所有其他选项卡对话,“无处不在”
  • 为什么和shared worker的通讯是连续的?为什么从 UI 到专用工作人员的通信不是?

标签: javascript web-worker


【解决方案1】:

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

例如,在主线程中创建两个worker,并将shared的port对象转移到dedicated:

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看到这个工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多