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

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

4

2 回答 2

11

我不知道,尽管规范的措辞似乎表明它没有做出这样的保证(这令人惊讶)。很明显,一旦在接收端MessageEvent添加了task queue,那么它的顺序就保持了,虽然MessageEvent创建和调度与原始postMessage调用是异步的,所以理论上你可能会出现以下情况:

主线程:

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

如果线程管理系统允许第二个postMessage线程在第一个线程成功调度之前执行MessageEvent,并且无论出于何种不幸的原因允许新线程执行(稀释的优先级反转),再次在第一个线程成功调度之前执行,那么您确实会收到这些消息以相反的顺序。

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

于 2011-09-24T09:15:06.790 回答
5

window.postMessage()仅在被调用时触发消息事件,并且与经典事件发布-订阅机制一样,它们的顺序并不能真正保证顺序。

于 2011-09-24T09:02:34.920 回答