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

HRJ*_*HRJ 7 web-worker

创建一个worker后,我可以通过它发送消息postMessage.例如:

var worker = new Worker('helper.js');
worker.postMessage({...});
Run Code Online (Sandbox Code Playgroud)

在helper.js中,worker需要使用添加一个监听器 onmessage = function (event) { ... };

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

Mic*_*mza 8

http://www.w3.org/TR/2015/WD-workers-20150924/#communicating-with-a-dedicated-worker 上的规范说

专用 worker 使用的隐式 MessagePort 在创建时隐式启用了其端口消息队列


tob*_*bek 6

在浏览器下载和解析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应该没问题。