for...of 循环内可用 await,但必须在 async 函数中;串行执行需每次 await,并发用 Promise.all(),可控并发可分批处理。

不能直接在 for...of 循环体内使用 await,因为 for...of 本身不是异步语法结构;但你可以让遍历过程“等待”每个异步操作完成,关键在于:循环体必须位于 async 函数中,且每次 await 都会暂停当前迭代,等 Promise 解析后再继续下一次。
确保外层函数是 async
这是前提。只有在 async 函数里才能用 await:
async function processItems(items) {
for (const item of items) {
const result = await fetchItem(item); // ✅ 合法:在 async 函数内
console.log(result);
}
}
逐个等待(串行执行)
最常见也最直观的方式:每次迭代都 await 一个 Promise,自然形成串行顺序执行:
- 适合依赖前序结果、需严格顺序、或 API 有调用频率限制的场景
- 注意:如果某个
await抛错,后续迭代不会执行(可用try/catch包裹单次操作来避免中断)
并发执行全部(不阻塞循环)
若想“发起所有请求再统一等待”,就不能在 for...of 里 await,而是先收集 Promise,再用 Promise.all():
async function processAll(items) {
const promises = [];
for (const item of items) {
promises.push(fetchItem(item)); // ❌ 不 await,只推入 Promise
}
const results = await Promise.all(promises); // ✅ 一次性等待全部完成
return results;
}
- 适合独立任务、追求吞吐量的场景
-
Promise.all()任一失败则整体拒绝;如需容错,改用Promise.allSettled()
可控并发(如最多同时 3 个请求)
既不想串行太慢,又怕并发太多压垮服务,可用 map + Promise.all() 分批,或借助工具函数(如 p-limit)。简易手写分批示例:
async function processInBatches(items, limit = 3) {
const batches = [];
for (let i = 0; i
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











