Atomics.waitAsync()

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

Atomics.waitAsync() 静态方法会验证共享内存位置是否包含给定值。如果内存位置与给定值不匹配,它会立即返回一个 value 属性为字符串 "not-equal" 的对象;如果设置的超时时间为零,则返回一个 value 属性为字符串 "timed-out" 的对象。否则,该方法会返回一个对象,其 value 属性是一个 Promise,当调用 Atomics.notify() 时,该 Promise 会以 "ok" fulfilled,或者在超时到期时以 "timed-out" fulfilled。

Atomics.waitAsync()Atomics.notify() 一起使用,以共享内存中的值为基础实现线程同步。如果同步值已更改,线程可以立即继续执行;或者,当线程到达同步点时,它可以等待来自另一个线程的通知。

此方法仅适用于查看 SharedArrayBufferInt32ArrayBigInt64Array。它是非阻塞的,并且与 Atomics.wait() 不同,可以在主线程上使用。由于它不会阻塞整个线程,因此您仍然需要小心,不要在 Promise 结算之前访问共享内存。

语法

js
Atomics.waitAsync(typedArray, index, value)
Atomics.waitAsync(typedArray, index, value, timeout)

参数

typedArray

一个查看 SharedArrayBufferInt32ArrayBigInt64Array

index

typedArray 中等待的位置。

value

要测试的预期值。

timeout 可选

等待时间(以毫秒为单位)。NaN(以及转换为 NaN 的值,例如 undefined)将变为 Infinity。负值将变为 0

返回值

一个具有以下属性的 Object

async

一个布尔值,指示 value 属性是否为 Promise

value

如果 asyncfalse,它将是一个字符串,该字符串为 "not-equal""timed-out"(仅当 timeout 参数为 0 时)。如果 asynctrue,它将是一个 Promise,该 Promise 以字符串值 "ok""timed-out" fulfilled。Promise 永远不会被 reject。

异常

TypeError

如果 typedArray 不是查看 SharedArrayBufferInt32ArrayBigInt64Array,则会抛出此异常。

RangeError

如果 indextypedArray 中超出界限,则抛出。

示例

使用 waitAsync()

给定一个共享的 Int32Array

js
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);

一个读取线程正在睡眠,并等待位置 0,预期该位置的值为 0。result.value 将是一个 Promise。

js
const result = Atomics.waitAsync(int32, 0, 0, 1000);
// { async: true, value: Promise {<pending>} }

在读取线程或另一个线程中,调用内存位置 0,并且 Promise 可以以 "ok" 解析。

js
Atomics.notify(int32, 0);
// { async: true, value: Promise {<fulfilled>: 'ok'} }

如果它没有解析为 "ok",则共享内存位置中的值不是预期的值(value 将是 "not-equal" 而不是 Promise),或者已达到超时时间(Promise 将解析为 "time-out")。

规范

规范
ECMAScript® 2026 语言规范
# sec-atomics.waitasync

浏览器兼容性

另见