Atomics.waitAsync是Worker专用异步等待原语,需跨源隔离环境、SharedArrayBuffer支持及正确视图构造,配合Atomics.notify唤醒并加超时保护。

Atomics.waitAsync 是专为 Worker 设计的异步等待原语,它能让 Worker 在不冻结线程的前提下,高效响应共享内存中的状态变更。关键在于它不阻塞执行栈,而是返回一个 Promise,配合 await 即可自然衔接后续逻辑。
必须满足的运行环境条件
这个 API 不是“写了就能用”的功能,它依赖底层安全机制:
- 服务器响应头必须包含 Cross-Origin-Opener-Policy: same-origin 和 Cross-Origin-Embedder-Policy: require-corp
- 不能在
file://协议下测试,需通过本地 HTTP 服务(如python3 -m http.server 8000)启动页面 - 主线程和 Worker 都要能访问
SharedArrayBuffer—— 可用typeof SharedArrayBuffer !== 'undefined'检查 -
Atomics.waitAsync必须是函数类型,否则说明跨源隔离未生效
Worker 中正确建立等待逻辑
等待不是凭空发生的,它需要明确的内存视图、初始值确认和结构化调用:
- 主线程创建
SharedArrayBuffer并初始化值,例如:const sab = new SharedArrayBuffer(4); const iv = new Int32Array(sab); iv[0] = 0; - 通过
postMessage({ sab })将缓冲区传给 Worker - Worker 接收后,必须用相同类型构造视图:
const iv = new Int32Array(e.data.sab)(类型错配会导致行为异常) - 等待前先读一次当前值:
const current = Atomics.load(iv, 0),避免错过已发生的变更 - 在 async 函数中调用:
const { value, asyncId } = await Atomics.waitAsync(iv, 0, current)—— 表示“等位置 0 的值不再是current”
通知方必须精准匹配唤醒规则
等待不会自动结束,它完全依赖另一端的 Atomics.notify 调用:
- 通知必须发生在等待调用之后,且使用同一
Int32Array视图 - 调用形式为:
Atomics.notify(iv, 0, 1),第三个参数是唤醒数量,1表示只唤醒一个等待者 - 如果多个 Worker 同时等待,而你只 notify 1 次且传
1,其余等待仍会挂起;按需调整数量 - 务必加超时保护,例如用
Promise.race([waitPromise, new Promise(r => setTimeout(r, 5000))])防止永久 pending
常见失效原因与规避方式
很多问题不是代码写错,而是同步逻辑被忽略:
- 主线程改值没用
Atomics.store(iv, 0, newValue),而是直接赋值iv[0] = newValue—— 这样不会触发 notify 唤醒 - Worker 内多次 await 同一 waitAsync,但 notify 只发一次,导致部分 await 永远不 resolve
- 主线程和 Worker 使用不同字节偏移或不同视图类型(如 Uint8Array vs Int32Array)操作同一块内存
- 忘记在通知前确保值已更新,即
Atomics.store和Atomics.notify必须成对出现,且顺序不能颠倒


















