JavaScript循环中处理异步操作需按执行顺序选方案:串行用for...of+await;并行用Promise.all;限并发推荐p-limit库;错误处理串行需循环内try/catch,并行宜用Promise.allSettled。

在 JavaScript 循环中处理异步操作,核心是避免用 for 或 forEach 直接 await 普通异步函数(会阻塞后续迭代或根本不起作用),而要根据执行顺序需求选择合适的控制方式。
串行执行:一个接一个等前一个完成
适合依赖上一步结果、需严格顺序、或防止并发压力过大的场景。用 for...of 配合 await 最直观可靠:
async function runSerial(urls) {
for (const url of urls) {
const res = await fetch(url); // 等这次请求完,再进下一轮
console.log(await res.text());
}
}
注意:forEach + async 回调无效,因为 forEach 不等待 Promise,会“火球式”并发发起所有请求。
并行执行:全部同时发起,统一等待结果
适合各任务独立、追求最短总耗时的场景。用 Promise.all 包裹所有异步调用:
立即学习“Java免费学习笔记(深入)”;
async function runParallel(urls) {
const promises = urls.map(url => fetch(url).then(r => r.text()));
const results = await Promise.all(promises);
console.log(results);
}
缺点:任一失败则整体 reject;无法控制并发数量。
限制并发的并行(如最多 3 个同时请求)
兼顾效率与稳定性,常见于爬虫或批量 API 调用。可用 Promise.allSettled + 分批或更简洁的递归/队列方式:
- 简单分批:把数组切块,逐块
Promise.all执行 - 推荐方案:用
p-limit库(轻量、稳定) - 手写简易版:维护运行中计数器 + 递归触发新任务
import pLimit from 'p-limit';
const limit = pLimit(3);
async function runLimited(urls) {
const results = await Promise.all(
urls.map(url => limit(() => fetch(url).then(r => r.json())))
);
}
错误处理不能只靠 try/catch 外层
串行时单个失败会中断整个流程,需在循环内捕获;并行时建议用 Promise.allSettled 获取每个结果状态:
- 串行:在
for内加try/catch,决定继续还是退出 - 并行:
Promise.allSettled返回每个 Promise 的{status, value/error},可分别处理成功与失败项
别让一个失败的请求拖垮整批任务。


















