bka*_*ase 15 javascript web-worker
有没有办法在Web工作者中同步等待或检查新消息?
我有一个庞大的复杂代码体(从emscripten编译的LLVM),我无法围绕回调进行重构.
我需要确保在某个行之后的代码不会执行,直到我收到并处理来自UI线程的消息.如果我用while循环阻塞,事件循环永远不会运行,所以我无法接收消息.
这是我在使用Pyodide时也遇到的问题。我想从主线程“同步”调用一个函数。
一种解决方案涉及Atomics 和SharedArrayBufferAPI。从网络工作者的角度来看,这看起来像下面这样
postMessage主线程Atomics.waitSharedArrayBuffer。我们无法以 a 的形式接收结果postMessage,因为没有同步方式询问“我收到消息了吗”。当然,这需要大量的额外代码来处理所有序列化、数据传递等。
主要限制是要使用这些 API,需要设置COOP/COEP 标头。另一件需要记住的事情是,这仅适用于最新的浏览器,例如 Safari 15.2(于 2021 年 12 月发布)。
还有一种带有同步 XHR 和服务工作者的替代解决方案,但我还没有研究过该选项。