在专用 Worker 中生成共享 Worker
Spawning a Shared Worker in a Dedicated Worker
我正在研究 WebWorkers。不知何故,我有了让一个页面的不同实例知道另一个页面何时关闭的想法。因此,我写了一个 Shared Worker,它工作正常。
但现在我想要一个 Dedicated Worker 作为 Shared Worker 的接口。因此 UI 中的昂贵操作不会影响与 Shared Worker 的持续通信。
但是我收到错误消息,未定义 SharedWorker。一个想法是使用 MessageChannel,但我希望它至少在 Firefox 和 Chrome 中 运行,据我所知,Firefox 仍然没有 MessageChannel 的有效实现。
那么 - 这个问题有什么解决方法吗?
您不能在专用工作器中创建共享工作器对象。但是,您可以在主 UI 线程中创建一个共享 worker 并将其端口传递给专用 worker,以便它们可以直接通信。
例如,在主线程中创建两个worker,并将共享的port
对象转移到专用的:
var sharedWorker = new SharedWorker("worker-shared.js");
sharedWorker.port.start();
var dedicatedWorker = new Worker("worker-dedicated.js");
dedicatedWorker.postMessage({sharedWorkerPort: sharedWorker.port}, [sharedWorker.port]);
在共享工作器中,您可以在此端口上 post 消息:
self.onconnect = function(e) {
var port = e.ports[0];
self.setInterval(function() {
port.postMessage('sent from shared worker');
}, 1000);
};
您可以在专用版中对它们做出反应
self.onmessage = function(e) {
var sharedWorkerPort = e.data.sharedWorkerPort;
sharedWorkerPort.onmessage = function(e) {
console.log('received in dedicated worker', e.data);
};
};
看到这个工作
我正在研究 WebWorkers。不知何故,我有了让一个页面的不同实例知道另一个页面何时关闭的想法。因此,我写了一个 Shared Worker,它工作正常。
但现在我想要一个 Dedicated Worker 作为 Shared Worker 的接口。因此 UI 中的昂贵操作不会影响与 Shared Worker 的持续通信。 但是我收到错误消息,未定义 SharedWorker。一个想法是使用 MessageChannel,但我希望它至少在 Firefox 和 Chrome 中 运行,据我所知,Firefox 仍然没有 MessageChannel 的有效实现。
那么 - 这个问题有什么解决方法吗?
您不能在专用工作器中创建共享工作器对象。但是,您可以在主 UI 线程中创建一个共享 worker 并将其端口传递给专用 worker,以便它们可以直接通信。
例如,在主线程中创建两个worker,并将共享的port
对象转移到专用的:
var sharedWorker = new SharedWorker("worker-shared.js");
sharedWorker.port.start();
var dedicatedWorker = new Worker("worker-dedicated.js");
dedicatedWorker.postMessage({sharedWorkerPort: sharedWorker.port}, [sharedWorker.port]);
在共享工作器中,您可以在此端口上 post 消息:
self.onconnect = function(e) {
var port = e.ports[0];
self.setInterval(function() {
port.postMessage('sent from shared worker');
}, 1000);
};
您可以在专用版中对它们做出反应
self.onmessage = function(e) {
var sharedWorkerPort = e.data.sharedWorkerPort;
sharedWorkerPort.onmessage = function(e) {
console.log('received in dedicated worker', e.data);
};
};
看到这个工作