Javascript 如何从web worker调用共享worker?
是否可以从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,我需要在他们之间共享一个单例服务。当前在
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支持。