是通过worker.postMessage()发送的消息排队吗?

时间:2015-12-22 05:49:28

标签: web-worker

创建工作人员后,我可以通过postMessage向其发送消息。例如:

var worker = new Worker('helper.js');
worker.postMessage({...});

在helper.js中,worker需要使用onmessage = function (event) { ... };

添加一个监听器

我的问题是,如果在工作脚本仍在加载时向工作人员发送一条或多条消息,是否可以保证消息最终排队并传递,或者它们是否可能丢失?

2 个答案:

答案 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应该没问题。