for await...of 用于遍历异步可迭代对象,自动串行等待每个 Promise 解析;普通 Promise 数组需包装成 async iterable 才能使用,不可直接遍历;适用 AsyncGenerator、ReadableStream 等原生支持 Symbol.asyncIterator 的对象。

for await...of 用于遍历异步可迭代对象(如 AsyncIterator),比如 Promise 数组、fetch 响应流、或自定义的异步生成器。它会自动等待每个 Promise 解析后再进入下一次循环,比手动用 for + await 更简洁安全。
适用场景:必须是异步可迭代对象
不是所有数组或类数组都能直接 for await。普通 Promise 数组([Promise, Promise])本身不可迭代,需包装成 async iterable 才能用 for await。
- ✅ 可用:AsyncGenerator 函数返回值、ReadableStream、某些库的 async 迭代器(如 Node.js 的 fs.promises.readdir() 配合 { encoding: 'buffer' } 返回异步迭代器)
- ❌ 不可用:直接写
for await (const p of [fetch('/a'), fetch('/b')])会报错 —— 普通数组没有[Symbol.asyncIterator]
正确用法一:配合 AsyncGenerator
自己定义一个异步生成器,按需 yield Promise 结果:
async function* fetchUrls(urls) {
for (const url of urls) {
yield fetch(url).then(r => r.json());
}
}
<p>// 使用
for await (const data of fetchUrls(['/api/a', '/api/b'])) {
console.log(data); // 自动等待上一个完成再请求下一个(串行)
}正确用法二:把 Promise 数组转为异步可迭代对象
如果就想顺序执行一组 Promise,可以用工具函数包装:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
立即学习“Java免费学习笔记(深入)”;
function toAsyncIterable(promises) {
return {
[Symbol.asyncIterator]() {
let i = 0;
return {
next() {
if (i < promises.length) {
return promises[i++].then(v => ({ value: v, done: false }));
}
return Promise.resolve({ value: undefined, done: true });
}
};
}
};
}
<p>// 使用
const promises = [fetch('/a').then(r => r.text()), fetch('/b').then(r => r.text())];
for await (const text of toAsyncIterable(promises)) {
console.log(text);
}注意:for await 是串行,不是并行
它会等前一个 Promise settle 后才取下一个,适合需要顺序依赖的场景。如果想并发执行全部再收集结果,用 await Promise.all(promises) 更合适。
- 串行(for await):请求 A → 等 A 完 → 请求 B → 等 B 完
- 并行(Promise.all):同时发 A 和 B → 一起等 → 一起处理
不复杂但容易忽略:for await 的核心是消费 async iterator,不是“让 for 支持 await”。先确认你的数据源是否具备异步迭代能力,再决定是否封装或换用 Promise.all / reduce + await。

















