dav*_*vin 9

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

主线程:

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

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

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


Sak*_*ket 5

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