for-await-of是专为异步流设计的语法,需目标为异步可迭代对象、返回异步迭代器,且循环必须在async函数内;适用于ReadbleStream、WebSocket、数据库游标等场景。

for-await-of 是专为逐个消费异步流数据设计的语法,它让异步迭代像同步遍历一样自然——每次循环自动等待当前异步值就绪,再进入下一轮。
必须满足两个前提条件
它不是万能“Promise数组遍历器”,不能直接套在普通 Promise 数组上。要让它正常工作,目标对象必须:
- 是异步可迭代对象(Async Iterable),即实现了
Symbol.asyncIterator方法; - 该方法返回一个异步迭代器(Async Iterator),其
next()方法返回Promise<{ value, done }>; - 整个
for await...of循环必须写在 async 函数内部,否则语法报错。
典型适用场景:流式、持续、按需获取的数据源
这类数据不适合一次性加载,也不适合用 Promise.all 并行拉取。常见例子包括:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- Node.js 中的
ReadableStream(如文件读取、HTTP 响应体); - WebSocket 消息流或 SSE(Server-Sent Events);
- 数据库游标查询(如 MongoDB 的
find().stream()); - 自定义异步生成器(
async function*),比如定时推送、轮询结果、分页拉取。
怎么把普通 Promise 数组变成可 for-await-of 的形式?
如果手头只有几个独立 Promise(比如三个 API 请求),想按顺序等待执行,可以简单包装成异步可迭代对象:
const promises = [
fetch('/api/user').then(r => r.json()),
fetch('/api/posts').then(r => r.json()),
fetch('/api/comments').then(r => r.json())
];
// 包装为异步可迭代对象
const asyncIterable = {
[Symbol.asyncIterator]: async function*() {
for (const p of promises) {
yield await p; // 等待每个 Promise 完成后再 yield
}
}
};
// 现在可以用了
(async () => {
for await (const data of asyncIterable) {
console.log(data);
}
})();
错误处理要包裹在 try-catch 里
异步流可能中途失败(如网络中断、流关闭),单个 yield 抛错会终止整个循环。推荐显式捕获:
async function readStream(stream) {
try {
for await (const chunk of stream) {
process(chunk);
}
} catch (err) {
console.error('流读取异常:', err.message);
// 可选择重试、降级或清理资源
}
}

















