window.postMessage是否保证事件的顺序?

时间:2011-09-24 03:50:17

标签: javascript postmessage

window.onmessage = ...
window.postMessage('1', '*');
window.postMessage('2', '*');

postMessagehttp://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#queue-a-task)是否保证事件的顺序?

2 个答案:

答案 0 :(得分:8)

我不知道,虽然the spec的措辞似乎表明它没有做出这样的保证(这是令人惊讶的)。很明显,一旦将MessageEvent添加到接收端的task queue,就会维护它的顺序,尽管MessageEvent创建和分发与原始postMessage不同步打电话,所以从理论上讲,你可能会遇到以下情况:

主线程:

window.postMessage('1', '*'); --> thread spawned to create MessageEvent
window.postMessage('2', '*'); --> new thread spawned for another MessageEvent

如果线程管理系统允许第二个postMessage在第一个线程设法调度MessageEvent之前执行,并且由于任何不幸的原因允许更新的线程执行(稀释的优先级倒置),在第一次设法发送之前,你确实会以相反的顺序接收这些消息。

虽然规范中可能还有其他一些地方为这些异步执行提供了更多的上下文并排除了这种情况 - 我找不到它。

答案 1 :(得分:4)

window.postMessage()仅在被调用时触发消息事件,与经典事件发布 - 订阅机制一样,订单中没有真正的订单保证。