从 SharedWorker 向 SharedWorker 发送消息
Sending messages from SharedWorker to SharedWorker
MDN Documentation on SharedWorkers 状态:
The SharedWorker interface represents a specific kind of worker that can be accessed from several browsing contexts, such as several windows, iframes or even workers.
对我来说,这听起来好像 SharedWorkers 应该能够直接交换消息。但是,如果我尝试从另一个 SharedWorker 中访问一个 SharedWorker,即
var worker = new SharedWorker("path/to/file.js");
我明白了
ReferenceError: SharedWorker is not defined
我是不是误读了文档,还是有其他方法可以做到这一点?
虽然您似乎无法从共享工作者创建共享工作者,但您可以通过在主线程中创建它们并将其中一个的 MessagePort
对象传递给其他。请注意,您必须将端口包含在 postMessage
的传输列表参数中:无法复制。
例如,在主线程中创建worker,并将其中一个的端口发送给另一个:
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]);
在第一个 worker 中,您可以在端口上发送消息:
self.onconnect = function(e) {
var port = e.ports[0];
self.setInterval(function() {
port.postMessage('sent from worker 1');
}, 1000);
};
然后在第二个 worker 中,您可以保存传入端口对象,并响应在其上收到的消息。
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);
};
};
};
看到这个工作
MDN Documentation on SharedWorkers 状态:
The SharedWorker interface represents a specific kind of worker that can be accessed from several browsing contexts, such as several windows, iframes or even workers.
对我来说,这听起来好像 SharedWorkers 应该能够直接交换消息。但是,如果我尝试从另一个 SharedWorker 中访问一个 SharedWorker,即
var worker = new SharedWorker("path/to/file.js");
我明白了
ReferenceError: SharedWorker is not defined
我是不是误读了文档,还是有其他方法可以做到这一点?
虽然您似乎无法从共享工作者创建共享工作者,但您可以通过在主线程中创建它们并将其中一个的 MessagePort
对象传递给其他。请注意,您必须将端口包含在 postMessage
的传输列表参数中:无法复制。
例如,在主线程中创建worker,并将其中一个的端口发送给另一个:
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]);
在第一个 worker 中,您可以在端口上发送消息:
self.onconnect = function(e) {
var port = e.ports[0];
self.setInterval(function() {
port.postMessage('sent from worker 1');
}, 1000);
};
然后在第二个 worker 中,您可以保存传入端口对象,并响应在其上收到的消息。
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);
};
};
};
看到这个工作