2015-12-22 123 views
4

创建工人后,我可以通过postMessage发送消息给它。例如:是通过worker.postMessage()排队的消息吗?

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

内helper.js,工人需要添加使用onmessage = function (event) { ... };

我的问题是,如果一个或多个消息被发送到工人,而工人脚本仍在加载的监听器,是否可以保证邮件最终排队并发送,还是有可能会丢失?

回答

2

http://www.w3.org/TR/2015/WD-workers-20150924/#communicating-with-a-dedicated-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(''); 
    

    与工人只是输出到控制台

    self.onmessage = function() { 
        console.log('received'); 
    } 
    

    后立即发布消息一直表现出2个控制台消息我在测试时。这并不能保证它总是以这种方式工作,但鉴于我试图让它失去信息而失败,这是合理的证据。而工人脚本下载并通过浏览器解析,但onmessage必须同步在工人(至少在铬V56)被定义

2

消息将被排队。

下面将充分工作:

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确实停止执行的工人,直到脚本下载,所以等到以后定义onmessage应该罚款。