首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步等待Web-Worker中的消息

同步等待Web-Worker中的消息
EN

Stack Overflow用户
提问于 2012-05-15 04:00:19
回答 5查看 2.6K关注 0票数 17

有没有办法同步等待或检查web-worker中的新消息?

我有一大堆复杂的代码(从emscripten编译的LLVM ),我不能围绕回调进行重构。

我需要确保在接收并处理来自UI-thread的消息之前,不会执行某一行之后的代码。如果我使用while循环阻塞,事件循环永远不会运行,所以我不能接收消息。

EN

回答 5

Stack Overflow用户

发布于 2021-08-28 06:31:09

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

一种解决方案涉及AtomicSharedArrayBuffer API。从web worker的角度来看,这看起来如下所示

Atomics.wait

  • get解冻我们自己,由主线程
  1. postMessage

  1. ,从SharedArrayBuffer中读取结果。我们不能以postMessage的形式接收结果,因为没有一种同步的方式来询问“我收到消息了吗”。

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

这样做的一个限制是它不能在Safari中工作,因为Safari没有实现Atomic的API。另一个限制是,要使用这些API,需要有COOP/COEP headers set

还有一种使用synchronous XHR and a service worker的替代解决方案,但我还没有研究过该选项。

票数 3
EN

Stack Overflow用户

发布于 2013-05-16 01:41:43

不,不幸的是。有一些关于添加阻止来自父页面的消息的方法的讨论,但没有取得任何进展。我看看能不能找到相关的邮件列表线程。

票数 1
EN

Stack Overflow用户

发布于 2015-02-07 23:31:15

你可以在不重构的情况下打破下面的序列吗?

代码语言:javascript
复制
wrk.onmessage = function(e) {
    if (e.data.step === 'initial input') {
        doInitialWork(e.data.inputs)
    } else if (e.data.step === 'ui input') {
        doTheRest(e.data.uiData)
    }
}

onmessage事件将被阻塞,直到初始步骤执行堆栈完成,关键ui位才会在信息可用时启动。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10590213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档