Symbol.asyncIterator 是 JavaScript 中定义异步迭代器的内置符号,需返回含 next() 方法的对象,该方法返回 Promise;可用手动实现或 async function* 生成器简化开发,适用于分页、流处理等异步场景。
symbol.asynciterator 是 javascript 中用于定义异步迭代器的内置符号,让对象支持 for await...of 循环。要实现它,核心是返回一个符合 async iterator protocol 的对象:该对象必须有 next() 方法,且返回 promise,promise 的 resolve 值需为 { value, done } 形式。
实现 asyncIterator 方法
在任意对象上定义 [Symbol.asyncIterator] 方法,返回一个异步迭代器对象:
- 该方法本身同步执行,但返回值必须是“异步迭代器对象”
- 异步迭代器对象必须有
next()方法,且该方法返回Promise -
done: true表示迭代结束;done: false时,value为当前项(可为 Promise,但通常由调用方处理)
手动实现一个简单异步迭代器
例如,模拟逐个延迟输出数字:
const asyncCounter = {
from: 1,
to: 3,
<p>[Symbol.asyncIterator]() {
let current = this.from;
const { to } = this;</p><pre class="brush:php;toolbar:false;">return {
next() {
if (current > to) {
return Promise.resolve({ value: undefined, done: true });
}
// 模拟异步操作(如 fetch、timeout、数据库查询等)
return new Promise(resolve => {
setTimeout(() => {
resolve({ value: current++, done: false });
}, 100);
});
}
};} };
// 使用 (async () => { for await (const num of asyncCounter) { console.log(num); // 依次输出 1、2、3,间隔 100ms } })();
配合生成器函数更简洁地实现
ES2018 起支持 async function*,可自动返回符合协议的异步迭代器:
- 用
async function*定义,内部用yield返回值 - 每次
yield都会暂停,并在next()被调用后恢复 - 函数体中可自由使用
await,适合封装异步逻辑(如分页请求、流式读取)
改写上面的例子:
const asyncCounter = {
from: 1,
to: 3,
<p>[Symbol.asyncIterator]: async function* () {
for (let i = this.from; i setTimeout(r, 100));
yield i;
}
}
};
</p>
实际场景建议
常见用途包括封装异步数据源:
- 分页 API:每次
yield一页数据,await fetch下一页 - Node.js 可读流(
ReadableStream):现代流默认支持Symbol.asyncIterator - 自定义事件流或定时任务流:按需生成带延迟的值
- 注意错误处理:在
next()或 async generator 中用try/catch,否则异常会拒绝 Promise,被for await...of捕获为 throw
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











