从 SharedWorker 向 SharedWorker 发送消息

aRe*_*ess 2 javascript web-worker

有关 SharedWorkers 的 MDN 文档指出:

SharedWorker 接口代表一种特定类型的工作人员,可以从多个浏览上下文(例如多个窗口、iframe甚至工作人员)访问它。

对我来说,这听起来好像 SharedWorkers 应该能够直接交换消息。但是,如果我尝试从另一个 SharedWorker 中访问 SharedWorker,即使用

var worker = new SharedWorker("path/to/file.js");
Run Code Online (Sandbox Code Playgroud)

我明白了

ReferenceError:SharedWorker 未定义

我只是误读了文档,还是有其他方法可以做到这一点?

Mic*_*mza 5

尽管您似乎无法从共享工作线程创建共享工作线程,但您可以通过在主线程中创建它们并将其中MessagePort一个的对象传递给另一个来在它们之间进行通信。请注意,您必须将端口包含在传输列表参数中postMessage:它无法复制。

例如,在主线程中创建工人,并将其中一个的端口发送给另一个:

var myWorker1 = new SharedWorker("worker1.js");
myWorker1.port.start();

var myWorker2 = new SharedWorker("worker2.js");
myWorker2.port.start();

myWorker2.port.postMessage({worker1Port: myWorker1.port}, [myWorker1.port]);
Run Code Online (Sandbox Code Playgroud)

在第一个工作程序中,您可以在端口上发送消息:

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

  self.setInterval(function() {
    port.postMessage('sent from worker 1');
  }, 1000);
};
Run Code Online (Sandbox Code Playgroud)

然后在第二个工作程序中,您可以保存传入端口对象,并响应在其上收到的消息。

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

  port.onmessage = function(e) {
    var worker1Port = e.data.worker1Port;
    worker1Port.onmessage = function(e) {
      console.log('received in worker 2', e.data);
    };
  };
};
Run Code Online (Sandbox Code Playgroud)

您可以在http://plnkr.co/edit/XTOej1b1PHfWuC9LHeZc?p=preview上看到它的工作原理