for-await-of 是消费异步迭代器的正确语法,要求对象实现 symbol.asynciterator 方法,其 next() 必须返回 promise;直接用 for-of 会出错。

for-of 循环本身是同步的,不能直接用于等待异步迭代器(如返回 Promise 的 next())的值。但 JavaScript 支持 异步迭代器(Async Iterator),它返回的是 { value, done } 的 Promise,配合 for-await-of 语法才能正确消费。
确保对象实现了异步迭代器协议
要让一个对象能被 for-await-of 遍历,它必须有一个返回异步迭代器的 [Symbol.asyncIterator] 方法。该方法需返回一个对象,该对象的 next() 方法返回 Promise。
- 普通同步迭代器用
[Symbol.iterator],而异步迭代器用[Symbol.asyncIterator] -
next()必须返回 Promise,即使值已就绪,也建议用Promise.resolve({ value, done })包裹 -
done: true表示结束;done: false表示还有更多项
手动实现一个异步可迭代对象
例如:模拟从 API 分页获取数据,每次 next() 返回一个 Promise:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
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。
- ❌ 错误:
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 结果
}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










