实现自定义异步迭代器需定义Symbol.asyncIterator方法并返回含next()的对象,next()返回Promise<{value,done}>,推荐用class管理状态,可选return()支持清理。

要实现自定义的异步迭代器,核心是让对象满足 Symbol.asyncIterator 方法,并返回一个符合异步迭代器协议的对象(即具有 next() 方法、返回 Promise 并最终 resolve { value, done } 的对象)。
定义符合协议的 asyncIterator 方法
JavaScript 中的异步迭代器必须在对象上部署 [Symbol.asyncIterator]() 方法。这个方法需返回一个对象,该对象的 next() 方法返回 Promise<{ value: any, done: boolean }>。
- 确保返回的是一个对象,不是 Promise;
next()才返回 Promise -
done: true表示迭代结束,之后的next()调用也应返回{ value: undefined, done: true } - 可配合闭包或类状态保存当前迭代位置(如索引、队列、流缓冲等)
用类封装并维护内部状态
推荐使用 class 实现,便于管理异步状态(例如读取文件块、轮询 API、消费消息队列)。构造时接收数据源或配置,内部保存游标、缓存、锁等。
- 在
[Symbol.asyncIterator]()中返回this或新实例(避免多次调用复用同一状态) -
next()方法中可 await 异步操作(如fetch、read()、setTimeout) - 注意错误处理:若异步操作失败,
next()返回的 Promise 应 reject,以便for await...of捕获
支持取消与清理(可选但推荐)
标准协议未强制要求取消机制,但在实际场景(如网络请求、定时任务)中,主动终止迭代能避免资源泄漏。
- 可添加
return()方法(非必需,但被for await...of在break/return时调用) -
return()应清理资源(如 abortAbortController、关闭 stream、清除 timer)并返回Promise.resolve({ value: undefined, done: true }) - 也可暴露
cancel()方法供手动调用
简单示例:延迟逐个返回数组项
以下是一个最小可行实现,模拟每 100ms 返回一个值:
class DelayedAsyncIterator {
constructor(items) {
this.items = items;
this.index = 0;
}
[Symbol.asyncIterator]() {
return this;
}
async next() {
if (this.index >= this.items.length) {
return { value: undefined, done: true };
}
await new Promise(r => setTimeout(r, 100));
return { value: this.items[this.index++], done: false };
}
// 可选:支持提前退出
async return() {
this.index = this.items.length;
return { value: undefined, done: true };
}
}
// 使用:
for await (const item of new DelayedAsyncIterator([1, 2, 3])) {
console.log(item); // 每 100ms 输出一个
}

















