2015-12-22 85 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應該罰款。