Atomics.waitAsync必须在Worker中运行且需满足跨源隔离、SharedArrayBuffer可用等全部条件;主线程仅初始化共享内存并通知,Worker内用async函数配合Atomics.load和waitAsync实现非阻塞等待,并需超时保护与精确匹配唤醒。

Atomics.waitAsync 不能在主线程使用,必须放在 Worker 内运行;它能实现非阻塞等待,但前提是共享内存、跨源隔离和正确调用三者全部到位。
必须满足的运行环境
缺一不可:
- 服务端响应头含 Cross-Origin-Opener-Policy: same-origin 和 Cross-Origin-Embedder-Policy: require-corp
- 页面不能通过
file://协议打开,需本地 HTTP 服务(如python3 -m http.server 8000) -
typeof SharedArrayBuffer !== 'undefined'且typeof Atomics.waitAsync === 'function'同时为真
主线程只负责初始化与分发
主线程不参与等待逻辑,只做三件事:
AI 舌诊面诊问诊医疗系统 + 诊疗商城系统源码是一套结合 AI 辅助诊断与商品转化的健康类程序,基于浩创云、ThinkPHP(PHP)开发,支持微信服务号与 H5 端,适合做中医舌诊面诊问答、健康建议推送以及配套诊疗商品的运营。
- 创建
SharedArrayBuffer并用Int32Array视图初始化状态(例如iv[0] = 0) - 通过
worker.postMessage(sab, [sab])传入缓冲区——注意第二个参数是转移列表,确保底层内存被共享而非拷贝 - 后续通知由主线程或某个 Worker 调用
Atomics.notify(iv, 0, 1)触发唤醒
Worker 内正确发起异步等待
所有等待逻辑必须封装在 async 函数中,且遵守原子操作规范:
- 先用
Atomics.load(iv, 0)确认初始值,避免错过已变更状态 - 再调用
const { value, asyncId } = await Atomics.waitAsync(iv, 0, expectedValue),其中expectedValue是你期望它“保持不变”直到被修改的那个值 - 务必加超时保护:用
Promises.race([waitPromise, setTimeoutPromise])防止永久 pending - 不要混用视图类型——Worker 和通知方必须都用
new Int32Array(sab),字节偏移与类型严格一致
协同通知的关键细节
唤醒不是自动发生的,依赖精确匹配:
-
Atomics.notify(iv, 0, n)的索引(0)和视图(iv)必须与waitAsync调用完全一致 - 第三个参数
n表示唤醒数量:设为1实现逐个唤醒,设为Infinity可广播,但需配合状态重检 - 通知必须发生在
waitAsync被调用之后,且不能早于该次等待注册完成(即不能在await前就 notify)

















