setTimeout(0)vs window.postMessage vs MessagePort.postMessage

时间:2013-09-16 11:13:52

标签: javascript html5 asynchronous timeout message

显然,使用window.postMessage是一个preferred way,可以在所有现代浏览器中对window.setTimeout(fn, 0)上的异步javascript回调进行排队。我在window.postMessageMessagePort.postMessage之间找不到相似的比较(使用相同的MessageChannel来异步发送和接收消息)。有没有人见过或做过任何时间? MessagePort.postMessage是否适用于此目的(如果可用)?

[已编辑] MessagePort.postMessage确实有效,但window.postMessage仍然是一种优先方式,IMO(请参阅我的回答)。

1 个答案:

答案 0 :(得分:6)

[更新] setImmediate JSFiddle 添加了测试。相关,cross-browser implementation使用了ASAP library Q David Baron's code来承诺解决/拒绝。

我继续使用window.postMessage的修改版本进行了一些计时,结果如下:

setImmediate - 使用setTimeoutMC
MessageChannel - 使用setTimeoutPM
window.postMessage - 使用setTimeout(0)

IE10:

setTimer

Chrome v29.0.1547.66:

2000 iterations of setTimeoutMC took 126 milliseconds.
2000 iterations of setTimeoutPM took 190 milliseconds.
2000 iterations of setTimeout(0) took 7986 milliseconds.

显然,{{3}}是胜利者(考虑到现有的跨浏览器支持级别)。更宽松的是2000 iterations of setTimeoutMC took 144 milliseconds. 2000 iterations of setTimeoutPM took 81 milliseconds. 2000 iterations of setTimeout(0) took 10589 milliseconds. ,应该尽可能避免。

<强>代码:

window.setTimeout(fn, 0)