在 javascript 中,await 在循环中的使用取决于你是否需要按顺序等待每个异步操作完成。如果需要串行执行(即前一个完成后才开始下一个),应使用 for...of 循环;如果不需要等待且希望并发执行,则应使用 for 循环配合 promise.all()。

for...of 如何实现串行等待
使用 for...of 循环可以确保 await 表达式在当前迭代完全结束后才进入下一次迭代,从而实现严格的串行执行流程。

const tasks = [1, 2, 3];
async function runSerially() {
for (const task of tasks) {
console.log(`Start task ${task}`);
await new Promise(resolve => setTimeout(resolve, 1000));
console.log(`End task ${task}`);
}
}
runSerially();
Promise.all 如何实现并发执行
当循环中的异步任务彼此独立时,可以使用 for 循环收集所有 Promise,然后通过 Promise.all() 一次性等待它们全部完成,从而大幅缩短总耗时。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型

const tasks = [1, 2, 3];
async function runConcurrently() {
const promises = tasks.map(task => {
console.log(`Start task ${task}`);
return new Promise(resolve => setTimeout(resolve, 1000)).then(() => {
console.log(`End task ${task}`);
return task;
});
});
const results = await Promise.all(promises);
console.log('All tasks finished:', results);
}
await 在 forEach 循环中的陷阱
很多人误以为可以在 Array.prototype.forEach 中使用 await 来实现串行或并发控制,但实际上这是无效的。因为 forEach 的回调函数虽然可以是 async 函数,但 forEach 本身不会等待这些回调返回的 Promise 完成,它会在所有回调启动后立即结束,导致主程序无法正确捕获异步结果或顺序。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










