Symbol.iterator以外的迭代协议:构建可中断的异步迭代器
深入AsyncIterator协议,实现具有取消、进度反馈和错误恢复的自定义可迭代对象。 · 难度:入门 · +10XP
Symbol.iterator以外的迭代协议:构建可中断的异步迭代器
大多数JS课程止步于普通的迭代器和生成器。本教程探索AsyncIterator(Symbol.asyncIterator)协议,这是处理流式数据(如文件读取、WebSocket消息、分页API)的核心。你将学习如何构建一个可中断的异步迭代器,支持调用者随时调用.return()停止迭代,同时清理资源。我们还会实现一个带进度通知的异步生成器,并在请求队列上应用它,实现背压控制(backpressure)。最后对比RxJS与原生异步迭代的设计哲学差异。
// 可中断的异步迭代器实现
class CancelableStream {
constructor(data) {
this.data = data;
this.canceled = false;
}
[Symbol.asyncIterator]() {
let i = 0;
return {
next: async () => {
if (this.canceled || i >= this.data.length) return { done: true };
await new Promise(r => setTimeout(r, 100));
return { value: this.data[i++], done: false };
},
return: async () => {
this.canceled = true;
return { done: true };
}
};
}
}