War*_*ock 3 javascript web-worker shared-worker
是否可以从Web Worker调用共享工作者?
能不能给我举个例子.
在我的情况下,我有一些网络工作者,我需要在他们之间共享一个单独的服务.
您可以使用类似于/sf/answers/2155727101/的技术.对于每个专用工作器,您可以创建一个共享工作器对象,指向同一个脚本,并将其端口传递给专用工作器.
请注意,对于相同的脚本URL,new SharedWorker(scriptUrl)不一定会创建新的共享工作线程:它只是创建一个允许您与共享工作线程进行通信的新对象,并且只有在尚不存在的情况下才创建该线程.
作为示例,以下创建2个Worker对象,每个对象创建一个单独的专用工作线程,以及2个SharedWorker对象,这些对象总共创建一个共享工作线程.共享worker的端口对象将传递给专用worker:
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]);
Run Code Online (Sandbox Code Playgroud)
然后,专用工作人员可以在收到的端口对象上发布消息:
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);
};
Run Code Online (Sandbox Code Playgroud)
共享工作者可以接收它们:
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);
};
};
Run Code Online (Sandbox Code Playgroud)
我在那里放了一些额外的代码,只是为了表明确实存在一个实际的共享工作线程.你可以在http://plnkr.co/edit/RcxxY2EDIcclUegC82wG?p=preview看到上面的工作