通过 worker.postMessage() 发送的消息是否已排队?
are messages sent via worker.postMessage() queued?
创建工人后,我可以通过postMessage
向它发送消息。例如:
var worker = new Worker('helper.js');
worker.postMessage({...});
在 helper.js 内部,工作人员需要使用 onmessage = function (event) { ... };
添加侦听器
我的问题是,如果在 worker 脚本仍在加载时向 worker 发送一条或多条消息,是否可以保证消息最终排队并传递,或者它们是否有可能丢失?
http://www.w3.org/TR/2015/WD-workers-20150924/#communicating-with-a-dedicated-worker 的规范说
The implicit MessagePort used by dedicated workers has its port message queue implicitly enabled when it is created
还有
https://developer.mozilla.org/en/docs/Web/API/Worker/postMessage 没有提到在发送消息之前必须等待 worker 加载
创建不能在缓存中的工作程序后立即测试发布消息http://plnkr.co/edit/jM1qy9lDEFKYhR0TDsKa?p=preview
var worker = new Worker('worker.js?' + (new Date()).getTime());
worker.postMessage('');
worker.postMessage('');
worker 只是输出到控制台
self.onmessage = function() {
console.log('received');
}
在测试时总是为我显示 2 条控制台消息。这并不能保证它会一直以这种方式工作,但考虑到我试图让它丢失消息并失败,这是合理的证据。
浏览器正在下载和解析 worker 脚本时,消息将被排队,但是 onmessage
必须在 worker 中同步定义(至少在 Chrome v56).
以下将不能完全工作:
worker.js:
setTimeout(function() {
onmessage = function() {
console.log('received message');
}
}, 0);
主要-script.js:
var worker = new Worker('worker.js');
worker.postMessage('first message'); // this won't go through
setTimeout(function() {
worker.postMessage('second message'); // this will
}, 1000);
工作人员的 onmessage
函数只会在第二条消息时触发。
我已经在这个 plunkr 中演示了这个问题:http://embed.plnkr.co/G54gk9Cz6XhZ3E6ZB3Nf/
importScripts
确实 在脚本下载完成之前停止在 worker 中执行,所以等到下载完之后再定义 onmessage
应该没问题。
创建工人后,我可以通过postMessage
向它发送消息。例如:
var worker = new Worker('helper.js');
worker.postMessage({...});
在 helper.js 内部,工作人员需要使用 onmessage = function (event) { ... };
我的问题是,如果在 worker 脚本仍在加载时向 worker 发送一条或多条消息,是否可以保证消息最终排队并传递,或者它们是否有可能丢失?
http://www.w3.org/TR/2015/WD-workers-20150924/#communicating-with-a-dedicated-worker 的规范说
The implicit MessagePort used by dedicated workers has its port message queue implicitly enabled when it is created
还有
https://developer.mozilla.org/en/docs/Web/API/Worker/postMessage 没有提到在发送消息之前必须等待 worker 加载
创建不能在缓存中的工作程序后立即测试发布消息http://plnkr.co/edit/jM1qy9lDEFKYhR0TDsKa?p=preview
var worker = new Worker('worker.js?' + (new Date()).getTime()); worker.postMessage(''); worker.postMessage('');
worker 只是输出到控制台
self.onmessage = function() { console.log('received'); }
在测试时总是为我显示 2 条控制台消息。这并不能保证它会一直以这种方式工作,但考虑到我试图让它丢失消息并失败,这是合理的证据。
浏览器正在下载和解析 worker 脚本时,消息将被排队,但是 onmessage
必须在 worker 中同步定义(至少在 Chrome v56).
以下将不能完全工作:
worker.js:
setTimeout(function() {
onmessage = function() {
console.log('received message');
}
}, 0);
主要-script.js:
var worker = new Worker('worker.js');
worker.postMessage('first message'); // this won't go through
setTimeout(function() {
worker.postMessage('second message'); // this will
}, 1000);
工作人员的 onmessage
函数只会在第二条消息时触发。
我已经在这个 plunkr 中演示了这个问题:http://embed.plnkr.co/G54gk9Cz6XhZ3E6ZB3Nf/
importScripts
确实 在脚本下载完成之前停止在 worker 中执行,所以等到下载完之后再定义 onmessage
应该没问题。