显然,使用window.postMessage是一个preferred way,可以在所有现代浏览器中对window.setTimeout(fn, 0)
上的异步javascript回调进行排队。我在window.postMessage和MessagePort.postMessage之间找不到相似的比较(使用相同的MessageChannel来异步发送和接收消息)。有没有人见过或做过任何时间? MessagePort.postMessage是否适用于此目的(如果可用)?
[已编辑] MessagePort.postMessage
确实有效,但window.postMessage
仍然是一种优先方式,IMO(请参阅我的回答)。
答案 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)