创建工作人员后,我可以通过postMessage
向其发送消息。例如:
var worker = new Worker('helper.js');
worker.postMessage({...});
在helper.js中,worker需要使用onmessage = function (event) { ... };
我的问题是,如果在工作脚本仍在加载时向工作人员发送一条或多条消息,是否可以保证消息最终排队并传递,或者它们是否可能丢失?
答案 0 :(得分:4)
http://www.w3.org/TR/2015/WD-workers-20150924/#communicating-with-a-dedicated-worker的规范说
专用worker使用的隐式MessagePort在创建时隐式启用了端口消息队列
另外
https://developer.mozilla.org/en/docs/Web/API/Worker/postMessage没有提及在发送邮件之前必须等待工作人员加载
在创建无法进入缓存的工作人员后立即测试发布消息http://plnkr.co/edit/jM1qy9lDEFKYhR0TDsKa?p=preview
time
工人只是输出到控制台
var worker = new Worker('worker.js?' + (new Date()).getTime());
worker.postMessage('');
worker.postMessage('');
在测试时,总是为我显示2个控制台消息。这并不能保证它始终以这种方式工作,但鉴于我试图让它失去信息并失败,这是合理的证据。
答案 1 :(得分:3)
在浏览器下载和解析工作人员脚本时,消息将排队,但 onmessage
必须在工作人员中同步定义(至少在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
功能只会触发第二条消息。
我在这个问题中证明了这个问题:http://embed.plnkr.co/G54gk9Cz6XhZ3E6ZB3Nf/
importScripts
在工作人员中停止执行,直到脚本被下载为止,所以等到那之后定义onmessage
应该没问题。