簡體   English   中英

將郵件從SharedWorker發送到SharedWorker

[英]Sending messages from SharedWorker to SharedWorker

關於SharedWorkersMDN文檔指出:

SharedWorker界面代表一種特定類型的工作程序,可以從多個瀏覽上下文(例如,多個窗口,iframe 甚至是worker)訪問該工作程序

對我來說,聽起來好像SharedWorkers應該能夠直接交換消息。 但是,如果我嘗試從另一個SharedWorker內部訪問SharedWorker,即

var worker = new SharedWorker("path/to/file.js");

我懂了

ReferenceError:未定義SharedWorker

我只是誤讀了文檔,還是有另一種方法?

盡管您似乎無法從共享工作器創建共享工作器,但是您可以通過在主線程中創建共享工作器並將它們的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]);

在第一個工作進程中,您可以在端口上發送消息:

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

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

然后在第二個工作線程中,您可以保存傳入的端口對象,並響應在其上收到的消息。

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);
    };
  };
};

您可以在http://plnkr.co/edit/XTOej1b1PHfWuC9LHeZc?p=preview中看到此方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM