Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从web worker调用共享worker?_Javascript_Web Worker_Shared Worker - Fatal编程技术网

Javascript 如何从web worker调用共享worker?

Javascript 如何从web worker调用共享worker?,javascript,web-worker,shared-worker,Javascript,Web Worker,Shared Worker,是否可以从Web Worker调用共享Worker 你能给我举个例子吗 在我的例子中,我有几个web Worker,我需要在他们之间共享一个单例服务。当前在WorkerGlobalScope中没有SharedWorker构造函数,因此您将无法像在iframe或窗口中一样构造实例 您可以做的是,为您的每个员工创建一个共享,并使用它在员工和sharedWorker之间进行通信。尽管这样做会消除对实际共享工作人员的需求,因为您也可以使用单个工作人员 例如: var numWorkers = 4; va

是否可以从Web Worker调用共享Worker

你能给我举个例子吗


在我的例子中,我有几个web Worker,我需要在他们之间共享一个单例服务。

当前在
WorkerGlobalScope
中没有
SharedWorker
构造函数,因此您将无法像在iframe或窗口中一样构造实例

您可以做的是,为您的每个员工创建一个共享,并使用它在员工和sharedWorker之间进行通信。尽管这样做会消除对实际
共享工作人员的需求,因为您也可以使用单个
工作人员

例如:

var numWorkers = 4;
var sharedWorker = new Worker("worker-shared.js");

for(var i = 0; i < numWorkers; i++) {
  var dedicatedWorker = new Worker("worker-dedicated.js");
  var channel = new MessageChannel();
  dedicatedWorker.postMessage({sharedWorkerPort: channel.port1}, [channel.port1]);
  sharedWorker.postMessage({workerPort: channel.port2}, [channel.port2]);
}
var numWorkers=4;
var sharedWorker=new Worker(“Worker shared.js”);
对于(变量i=0;i

您可以使用类似于的技术。对于每个专用工作进程,您可以创建一个指向同一脚本的共享工作进程对象,并将其端口传递给专用工作进程

请注意,对于相同的脚本URL,
new SharedWorker(scriptUrl)
不一定创建新的共享工作线程:它只创建一个新对象,允许您与共享工作线程通信,并且仅在线程本身不存在时创建线程本身

例如,下面创建2个
Worker
对象,每个对象创建一个单独的专用工作线程,以及2个
SharedWorker
对象,总共创建一个共享工作线程。共享工作进程的端口对象将传递给专用工作进程:

var sharedWorkerA = new SharedWorker("worker-shared.js");
sharedWorkerA.port.start();

var dedicatedWorkerA = new Worker("worker-dedicated.js");
dedicatedWorkerA.postMessage({sharedWorkerPort: sharedWorkerA.port, workerName: 'A'}, [sharedWorkerA.port]);

var sharedWorkerB = new SharedWorker("worker-shared.js");
sharedWorkerB.port.start();

var dedicatedWorkerB = new Worker("worker-dedicated.js");
dedicatedWorkerB.postMessage({sharedWorkerPort: sharedWorkerB.port, workerName: 'B'}, [sharedWorkerB.port]);
然后,专用工作人员可以在其接收的端口对象上发布消息:

self.onmessage = function(e) {
  var workerName = e.data.workerName;
  var sharedWorkerPort = e.data.sharedWorkerPort;

  self.setInterval(function() {
    sharedWorkerPort.postMessage('sent from dedicated worker ' + workerName);
  }, 2000);
};
共享工作人员可以接收它们:

var num = 0;
self.onconnect = function(e) {
  console.log('shared connect');
  var port = e.ports[0];

  port.onmessage = function(e) {
    num++;
    console.log('Received in shared worker: ', e.data);
    console.log('Number of messaged received:', num);
  };
};

我在其中添加了一些额外的代码,只是为了表明确实有一个实际的共享工作线程正在运行。您可以在

上看到@MichalCharemza的可能副本,该副本不适用于多个专用worker,因为
端口
对象只能传输一次。对于每个专用worker,您可以创建一个
新的SharedWorker
,并将端口对象传递给它。然而,我发现你所寻找的答案与当时的有点不同。取消我的投票…太棒了!非常感谢你!请注意,根据和
MessageChannel
默认情况下Firefox不支持
MessageChannel
现在Firefox支持。