2015-01-05 31 views
1

我聽說postMessage是Google Chrome對nextTick的實施。由於我認爲postMessage被用來在網絡工作者之間進行通信,所以我對此陳述有點困惑。postMessage如何被用作nextTick或setTimeout(__,0)的替代品?

我試過類似postMessage(function() {return;});這樣的表達式,而且只有在事件循環空閒時纔會發生錯誤而不是調度要運行的函數。看來,postMessage只會按預期收到一條消息。

當事件循環閒置時,如何使用postMessage作爲調度函數調用的方法?

+0

[引文需要] – Nit

+1

有一種老式的黑客通過向自己發佈消息使用postMessage產生更快的'setTimeout(fn,0)' - 它被異步調度,但沒有定時器隊列的開銷。請注意,它不再使用,而是通常使用「MutationObserver」hack代替。 –

+1

這裏 - 一些閱讀材料:http://dbaron.org/log/20100309-faster-timeouts –

回答

3

谷歌瀏覽器實際上運行在V8上,它具有微任務隊列的概念。 postMessage部分是DOM API的一部分,它調度一個微任務 - 類似於節點中的nextTick(儘管鉻循環週期與節點的非常不同)。

存在使用postMessage的模擬setTimeout(fn, 0),看起來像這樣的老黑客:直接使用MessageChannel代替窗口手段高明

var queue = []; 
window.addEventListener("message", function(e){ 
    if((e.source !== window) || (e.data === "flush")) return; // not the right message 
    queue.forEach(function(fn){ fn(); }); // call all functions; 
    queue = []; // clean the queue; 
}); 

function nextTick(fn){ 
    queue.push(fn); // add the function 
    window.postMessage(fn, "flush", "*"); 
} 

有,但它是完全一樣的想法。

你可以發現這種技術的老陳述in this blog post它很少再使用了,因爲使用突變觀察者可以更快速地使用setTimeout。

這裏是a relatively modern source關於不同的技術。