在Web-Worker中同步等待消息

bka*_*ase 15 javascript web-worker

有没有办法在Web工作者中同步等待或检查新消息?

我有一个庞大的复杂代码体(从emscripten编译的LLVM),我无法围绕回调进行重构.

我需要确保在某个行之后的代码不会执行,直到我收到并处理来自UI线程的消息.如果我用while循环阻塞,事件循环永远不会运行,所以我无法接收消息.

Ste*_*tch 9

这是我在使用Pyodide时也遇到的问题。我想从主线程“同步”调用一个函数。

一种解决方案涉及Atomics 和SharedArrayBufferAPI。从网络工作者的角度来看,这看起来像下面这样

  1. postMessage主线程
  2. 冻结我们自己Atomics.wait
  3. 被主线程解冻
  4. 从 a 读取结果SharedArrayBuffer。我们无法以 a 的形式接收结果postMessage,因为没有同步方式询问“我收到消息了吗”。

当然,这需要大量的额外代码来处理所有序列化、数据传递等。

主要限制是要使用这些 API,需要设置COOP/COEP 标头。另一件需要记住的事情是,这仅适用于最新的浏览器,例如 Safari 15.2(于 2021 年 12 月发布)。

还有一种带有同步 XHR 和服务工作者的替代解决方案,但我还没有研究过该选项。


law*_*sea 1

不,不幸的是。有人讨论过添加一种方法来阻止来自父页面的消息,但没有任何进展。我会看看是否可以挖掘相关的邮件列表线程。