Symbol.asyncIterator 是 JavaScript 中实现异步迭代的核心机制,使对象支持 for await...of;其方法返回含 Promise 形式 next() 的异步迭代器,用于处理分页、事件流等异步数据流。

JavaScript 中的 Symbol.asyncIterator 是原生支持异步迭代的核心机制,它让对象可以被 for await...of 循环消费,适用于按需获取 Promise 驱动的数据流(比如分页请求、事件流、数据库游标等)。
什么是 asyncIterator?
它是对象上一个方法,键为 Symbol.asyncIterator,返回一个符合异步迭代器协议的对象:该对象必须有 next() 方法,且该方法返回 Promise<{ value: any, done: boolean }>。
与同步 Symbol.iterator 不同,asyncIterator 的 next() 不直接返回结果,而是返回一个 Promise,因此能自然融入异步流程。
如何实现一个自定义 asyncIterator?
只需在对象上定义 [Symbol.asyncIterator]() 方法,并确保它返回一个具备 next() 的对象:
立即学习“Java免费学习笔记(深入)”;
-
每次调用
next()必须返回 Promise,不能是普通对象 -
done: true表示迭代结束,后续调用仍应返回{ value: undefined, done: true } -
可配合
await控制节奏,例如模拟延迟加载、分页拉取
示例:一个每秒产出一个数字的异步可迭代对象:
const counter = {
[Symbol.asyncIterator]() {
let i = 0;
return {
next() {
if (i < 3) {
return Promise.resolve({ value: i++, done: false });
}
return Promise.resolve({ value: undefined, done: true });
}
};
}
};
<p>// 使用
for await (const num of counter) {
console.log(num); // 0, 1, 2(依次输出,无等待)
}哪些内置类型已支持 Symbol.asyncIterator?
现代 JavaScript 引擎(Chrome 63+、Node.js 10+)已为部分类型提供原生 asyncIterator:
-
AsyncGeneratorFunction返回的异步生成器对象(最常见来源) -
ReadableStream(Web Streams API),可用于读取响应体、文件流等 -
某些第三方库扩展的对象(如
pg的查询游标、axios的流式响应封装)
注意:Array、Map、Set 等同步集合**不原生支持** asyncIterator,需手动包装或借助工具函数转换。
常见使用场景和注意事项
for await...of 是消费 asyncIterator 的标准方式,但它隐含执行顺序和错误传播逻辑:
-
自动
await每次next(),无需手动写await iterator.next() -
异常会中断循环并抛出,可用
try...catch包裹整个for await块 -
不支持数组解构或扩展运算符直接展开(如
[...asyncIter]会报错),需用Array.fromAsync()(ES2024 提案,尚未广泛支持)或手动收集 -
避免在
next()中做不可取消的副作用,因为消费者可能提前break或return
若需兼容旧环境,可用 Babel 转译 for await...of,但 Symbol.asyncIterator 本身需 polyfill(如 es6-symbol + 手动挂载)。










