是否有某种方法可以同步等待或检查网络工作人员中的新消息?
我有一大堆复杂的代码(从 emscripten 编译的 LLVM),我无法围绕回调进行重构。
我需要确保在收到并处理来自 UI 线程的消息之前,特定行之后的代码不会执行。如果我用 while 循环阻塞,则事件循环永远不会运行,因此我无法接收消息。
这是我在工作中也遇到的问题Pyodide https://github.com/pyodide/pyodide。我想从主线程“同步”调用一个函数。
一种解决方案涉及Atomic
s and SharedArrayBuffer
蜜蜂。从网络工作者的角度来看,这看起来像下面这样
-
postMessage
主线程
- 冻结我们自己
Atomics.wait
- 被主线程解冻
- 读取结果
SharedArrayBuffer
。我们无法收到结果postMessage
,因为没有同步方式询问“我收到消息了吗”。
当然,这需要大量的额外代码来处理所有序列化、数据传递等。
主要限制是要使用这些 API,需要具备COOP/COEP 标头集 https://dev.to/stefnotch/enabling-coop-coep-without-touching-the-server-2d3n。另一件需要记住的事情是,这仅适用于最新的浏览器,例如 Safari 15.2(于 2021 年 12 月发布)。
还有一个替代解决方案同步 XHR 和 Service Worker https://glitch.com/edit/#!/sleep-sw?path=worker.js%3A28%3A71,但我还没有研究过这个选项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)