创建一个worker后,我可以通过它发送消息postMessage.例如:
var worker = new Worker('helper.js');
worker.postMessage({...});
Run Code Online (Sandbox Code Playgroud)
在helper.js中,worker需要使用添加一个监听器 onmessage = function (event) { ... };
我的问题是,如果在工作脚本仍在加载时向工作人员发送一条或多条消息,是否可以保证消息最终排队并传递,或者它们是否可能丢失?
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
var worker = new Worker('worker.js?' + (new Date()).getTime());
worker.postMessage('');
worker.postMessage('');
Run Code Online (Sandbox Code Playgroud)
工人只是输出到控制台
self.onmessage = function() {
console.log('received');
}
Run Code Online (Sandbox Code Playgroud)
测试时总是向我显示 2 条控制台消息。这并不能保证它总是以这种方式工作,但考虑到我试图让它丢失消息并失败,这是合理的证据。
在浏览器下载和解析onmessage工作线程脚本时,消息将排队,但必须在工作线程中同步定义(至少在 Chrome v56 中)。
以下将无法完全工作:
工人.js:
setTimeout(function() {
onmessage = function() {
console.log('received message');
}
}, 0);
Run Code Online (Sandbox Code Playgroud)
主脚本.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);
Run Code Online (Sandbox Code Playgroud)
worker 的onmessage函数只会为第二条消息触发。
我已经在这个 plunkr 中演示了这个问题:http ://embed.plnkr.co/G54gk9Cz6XhZ3E6ZB3Nf/
importScripts 在下载脚本之前,会停止在工作程序中执行,所以等到之后再定义onmessage应该没问题。
| 归档时间: |
|
| 查看次数: |
1278 次 |
| 最近记录: |