es6异步生成器(async function*)返回异步迭代器,其next()返回promise,支持for await...of流式处理异步数据,yield应为已resolve值,可配合promise.all实现并发控制。

ES6 异步生成器(async function*)结合 Promise,能自然地实现**按需拉取、逐项等待、流式处理异步数据**的逻辑,比手动写 Promise.then 链或传统生成器 + 外部 runner 更简洁直接。
异步生成器本质是可 await 的迭代器
普通生成器(function*)返回同步迭代器,每次 next() 返回的是 { value, done };而异步生成器(async function*)返回的是 异步迭代器,它的 next() 方法返回一个 Promise,需用 await 解构:
-
const result = await asyncIterator.next()→ 得到 { value, done } -
value可以是任意值,包括 Promise,但通常就是你要的“一项异步结果” -
done为true表示流结束,适合用for await...of自动处理
用 for await...of 消费异步流
这是最常用、最直观的方式。只要异步生成器内部 yield 的是已 resolve 的值(比如 await fetch(...) 后的 JSON),外部就能像遍历数组一样逐项处理:
- 每轮循环自动
await下一项,暂停执行直到该次异步操作完成 - 错误可统一用
try/catch捕获(在循环体内或外均可) - 支持
break、continue,随时中断流
例如分页拉取用户列表:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
async function* fetchUsersPaginated() {
let page = 1;
while (true) {
const res = await fetch(`/api/users?page=${page}`);
const users = await res.json();
if (users.length === 0) break;
for (const user of users) yield user; // 逐个 yield
page++;
}
}
<p>// 使用
for await (const user of fetchUsersPaginated()) {
console.log(user.name);
if (user.id === 100) break; // 提前退出
}</p>
yield Promise 本身不推荐,应先 await 再 yield
虽然语法上允许 yield fetch(...)(即 yield 一个 Promise 对象),但这会让消费者拿到未 resolve 的 Promise,必须再 await value —— 增加心智负担且易出错:
- ❌ 不推荐:
yield fetch('/api/user/1').then(r => r.json()) - ✅ 推荐:
const data = await fetch('/api/user/1').then(r => r.json()); yield data
异步生成器的设计初衷,就是让 yield 出来的是“就绪的结果”,而不是“待处理的任务”。这样流的语义才清晰:每一次 yield 都代表一个已完成的异步单元。
配合 Promise.all 实现并发控制
若需批量处理但又不想全量并发(比如限制同时最多 3 个请求),可在异步生成器内部用 Promise.all 分批调度:
- 把一批 ID 切片,
await Promise.all(ids.map(id => fetch(...))) - 再对这批结果逐个
yield,保持流式输出 - 既利用了并发提升吞吐,又维持了单次消费的可控性
这种模式常见于大文件分块上传、数据库游标分页、实时日志聚合等场景。










