JavaScript异步生成器(async function*)是处理异步流数据的自然方式,支持await和yield,返回异步迭代器,需用for await...of或next()遍历,适用于分页API、文件读取、WebSocket等惰性流场景,并支持try/catch错误处理和return()提前终止。

JavaScript 异步生成器(async function*)是处理异步流数据最自然的方式之一——它把“按需获取、逐段消费”的逻辑封装进一个可迭代的对象里,配合 for await...of 就能写出接近同步风格的流式代码。
定义和基本用法
异步生成器用 async function* 声明,内部可使用 await 和 yield。每次 yield 返回的值会自动包装成 Promise,并由消费方等待解析。
- 函数返回的是一个异步迭代器,不是普通对象
- 必须用
for await...of或手动调用next()(它返回 Promise)来遍历 - 不能用普通
for...of,否则拿到的是未 resolve 的 Promise
处理分页 API 数据流
这是最典型的应用场景:避免一次性拉取全部数据,而是一页一页请求、一页一页处理。
- 在循环中用
await fetch获取响应,再await res.json() - 用
yield输出当前页数据,暂停并等待下一次迭代触发 - 当某页无数据或接口返回
done: true,用break或return结束生成
例如:
立即学习“Java免费学习笔记(深入)”;
async function* fetchUsers(page = 1) {
while (true) {
const res = await fetch(`/api/users?page=${page}`);
const users = await res.json();
if (users.length === 0) break;
yield users;
page++;
}
}消费流式数据(如文件、日志、WebSocket)
异步生成器适合封装任何“持续产出异步事件”的源头。
- 读取
ReadableStream(如response.body)时,用reader.read()按块获取,解码后按行yield - 监听 WebSocket 消息时,每次
message事件可yield event.data - 数据库游标遍历时,每次
cursor.next()后yield record
关键点是:每一步都保持“惰性”——不提前加载,只在需要时才触发异步操作。
错误处理与提前终止
异步生成器支持完整的异常控制流:
- 内部用
try/catch捕获await抛出的错误 - 外部消费循环可用
try/catch包裹for await...of - 调用迭代器的
return()方法可提前退出,并触发生成器内finally块,适合清理资源(如关闭连接、释放 reader)


















