异步生成器通过async function*定义,结合for await...of可优雅处理异步数据流,如分页请求、事件流等场景,自动实现异步迭代器协议,简化异步序列操作。

异步迭代器与生成器结合使用,可以让开发者更优雅地处理异步数据流。JavaScript中的async function*语法正是为此设计的。通过在生成器函数前加上async关键字,可以创建一个异步生成器,它返回一个符合异步迭代器协议的对象。
异步生成器的基本用法
异步生成器函数使用 async function* 定义,可以在其中使用 await 并通过 yield 返回异步结果。
- 每次调用
yield可以返回一个 Promise,自动被包装为异步迭代项 - 函数体内的
await可用于等待异步操作完成 - 返回的异步迭代器可通过
for await...of消费
示例:模拟逐个获取远程数据
async function* fetchUsers() {
const userIds = [1, 2, 3, 4];
for (const id of userIds) {
const response = await fetch(`/api/users/${id}`);
const user = await response.json();
yield user;
}
}
// 使用 for await...of 遍历
for await (const user of fetchUsers()) {
console.log(user.name);
}
异步迭代器协议详解
一个异步迭代器需实现 next() 方法,该方法返回一个 Promise,Promise 的结果是 { value, done } 结构。
立即学习“Java免费学习笔记(深入)”;
网趣购物系统静态版支持网站一键静态生成,采用动态进度条模式生成静态,生成过程更加清晰明确,商品管理上增加淘宝数据包导入功能,与淘宝数据同步更新!采用领先的AJAX+XML相融技术,速度更快更高效!系统进行了大量的实用性更新,如优化核心算法、增加商品图片批量上传、谷歌地图浏览插入等,静态版独特的生成算法技术使静态生成过程可随意掌控,从而可以大大减轻服务器的负担,结合多种强大的SEO优化方式于一体,使
-
value是当前产出的值 -
done表示是否已结束(true 表示结束) - 异步生成器自动实现了这个协议
手动实现一个异步迭代器虽然可行,但使用异步生成器更简洁:
async function* countdown(from) {
for (let i = from; i > 0; i--) {
await new Promise(resolve => setTimeout(resolve, 1000));
yield i;
}
}
for await (const tick of countdown(3)) {
console.log(tick); // 每秒输出 3, 2, 1
}
实际应用场景
这种组合特别适合处理分页数据、事件流或需要延迟处理的队列任务。
- 读取大型日志文件时,按块异步加载并处理
- 从 WebSocket 或 SSE 流中持续接收消息
- 实现带背压的数据管道
例如,处理分页 API:
async function* paginatedAPI(url) {
let page = 1;
while (true) {
const res = await fetch(`${url}?page=${page}`);
const data = await res.json();
if (data.items.length === 0) break;
for (const item of data.items) {
yield item;
}
page++;
}
}
for await (const item of paginatedAPI('/logs')) {
console.log(item);
}
基本上就这些。异步生成器简化了异步序列的构建和消费,配合 for await...of 能写出清晰且高效的流式代码。不复杂但容易忽略的是,每个 yield 的值会被自动 Promise 化,无需手动包装。









