sharedarraybuffer 不支持 waitasync,该 api 尚未被任何浏览器正式启用;当前可用 atomics.waitasync(chrome/edge 93+ 实验性支持),需跨域隔离、sab 和 int32array,配合 atomics.notify 实现主线程非阻塞等待。

SharedArrayBuffer 本身不支持 waitAsync —— 这个 API 目前(截至 Chrome 125 / Safari 18 / Firefox 尚未实现)仅存在于规范草案中,**尚未被任何浏览器正式启用**,也未进入标准稳定阶段。因此,当前无法直接用 waitAsync 配合 SharedArrayBuffer 实现非阻塞主线程同步。
当前可行的替代方案:Atomics.waitAsync(已部分实现)
Chrome 93+ 和 Edge 93+ 已实验性支持 Atomics.waitAsync(需开启 --enable-blink-features=AtomicsWaitAsync 标志),它返回 Promise,可在主线程中 await 而不阻塞渲染。但注意:
- 它仍依赖
SharedArrayBuffer+Int32Array(或其他原子视图)作为同步原语 - Worker 中必须用
Atomics.notify唤醒等待方 - 主线程需启用跨域隔离(
crossorigin+COOP/COEP头)才能使用 SAB
最小可行同步流程(主线程 + Worker)
假设主线程等待 Worker 完成某项计算:
AI 舌诊面诊问诊医疗系统 + 诊疗商城系统源码是一套结合 AI 辅助诊断与商品转化的健康类程序,基于浩创云、ThinkPHP(PHP)开发,支持微信服务号与 H5 端,适合做中医舌诊面诊问答、健康建议推送以及配套诊疗商品的运营。
- 主线程创建
SharedArrayBuffer(4)和Int32Array(sab),初始值为0 - 主线程调用
await Atomics.waitAsync(i32, 0, 0)(等待值变为非 0) - Worker 执行任务后,调用
Atomics.store(i32, 1)再Atomics.notify(i32, 0) - 主线程 Promise 兑现,继续执行,UI 保持响应
关键注意事项
实际使用需严格满足以下条件:
-
跨域隔离必须启用:页面需通过
Cross-Origin-Opener-Policy: same-origin和Cross-Origin-Embedder-Policy: require-corp响应头启用 -
Worker 加载需带
type="module"或显式credentials: 'same-origin',否则无法访问 SAB -
Atomics.waitAsync 返回的 Promise 可能被拒绝:例如超时、视图无效、或等待被中断,务必
try/catch -
不要在非 SAB 视图上调用 Atomics 方法,会抛出
TypeError
兼容性兜底建议
由于 Atomics.waitAsync 仍属实验特性,生产环境推荐组合策略:
- 检测支持:
typeof Atomics.waitAsync === 'function' - 若不支持,回退到
postMessage+Promise包装(无共享内存,但兼容性好) - 对高频率同步场景,可结合
MessageChannel提升消息传递效率
不复杂但容易忽略:真正的“非阻塞同步”依赖运行时能力与安全策略协同,不是单靠 API 调用就能达成。










