【发布时间】:2011-09-24 03:50:17
【问题描述】:
window.onmessage = ...
window.postMessage('1', '*');
window.postMessage('2', '*');
postMessage (http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#queue-a-task) 是否保证事件的顺序?
【问题讨论】:
window.onmessage = ...
window.postMessage('1', '*');
window.postMessage('2', '*');
postMessage (http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#queue-a-task) 是否保证事件的顺序?
【问题讨论】:
我不知道,虽然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 之前执行,并且无论出于何种不幸的原因允许新线程执行(稀释的优先级反转),再次在第一个线程之前执行设法发送,那么您确实会以相反的顺序收到这些消息。
虽然规范中可能有其他地方为这些异步执行提供更多上下文并排除了这种情况 - 我找不到它。
【讨论】:
postMessage() 通知监听器并以任意顺序传递响应,我如何区分这些消息?我想将给定的回复与第一篇文章或第二篇文章相关联。帖子针对相同的来源并形成相同的窗口,但针对不同的 URL。
window.postMessage()仅在被调用时触发消息事件,与经典的事件发布-订阅机制一样,并不能真正保证其顺序的顺序。
【讨论】: