for-await-of 是消费异步迭代器的正确语法,要求对象实现 Symbol.asyncIterator 方法,其 next() 必须返回 Promise<{value, done}>;直接用 for-of 会出错。

for-of 循环本身是同步的,不能直接用于等待异步迭代器(如返回 Promise 的 next())的值。但 JavaScript 支持 异步迭代器(Async Iterator),它返回的是 { value, done } 的 Promise,配合 for-await-of 语法才能正确消费。
确保对象实现了异步迭代器协议
要让一个对象能被 for-await-of 遍历,它必须有一个返回异步迭代器的 [Symbol.asyncIterator] 方法。该方法需返回一个对象,该对象的 next() 方法返回 Promise<{ value, done }>。
- 普通同步迭代器用
[Symbol.iterator],而异步迭代器用[Symbol.asyncIterator] -
next()必须返回 Promise,即使值已就绪,也建议用Promise.resolve({ value, done })包裹 -
done: true表示结束;done: false表示还有更多项
手动实现一个异步可迭代对象
例如:模拟从 API 分页获取数据,每次 next() 返回一个 Promise:
const asyncIterable = {
[Symbol.asyncIterator]() {
let page = 1;
const maxPages = 3;
return {
next() {
if (page > maxPages) {
return Promise.resolve({ value: undefined, done: true });
}
// 模拟异步请求
return new Promise(resolve => {
setTimeout(() => {
resolve({ value: `page-${page++}`, done: false });
}, 100);
});
}
};
}
};
// 正确用法:for-await-of
async function example() {
for await (const item of asyncIterable) {
console.log(item); // 'page-1', 'page-2', 'page-3'
}
}
example();
常见误区与注意事项
直接用 for-of 遍历异步迭代器会报错或得到未解包的 Promise —— 因为它尝试同步调用 next(),而实际返回的是 Promise。
立即学习“Java免费学习笔记(深入)”;
- ❌ 错误:
for (const item of asyncIterable) { ... }→ 报错或遍历 Promise 对象 - ✅ 正确:
for await (const item of asyncIterable) { ... } - 异步迭代器可在
async函数内使用,且支持break、continue和return - 可与
Array.from()或展开运算符配合?不行 ——[...asyncIterable]会失败;应改用await Array.fromAsync(asyncIterable)(ES2024 新增)
实用工具:将 Promise 数组转为异步可迭代对象
如果已有 Promise 数组,可快速包装成异步迭代器:
function asyncFromPromises(promiseArray) {
return {
[Symbol.asyncIterator]() {
let i = 0;
return {
next() {
if (i >= promiseArray.length) {
return Promise.resolve({ done: true });
}
return promiseArray[i++].then(value => ({ value, done: false }));
}
};
}
};
}
// 使用
const promises = [Promise.resolve('a'), fetch('/api/1'), Promise.resolve('c')];
for await (const res of asyncFromPromises(promises)) {
console.log(await res); // 自动 await 每个 Promise 结果
}


















