await 不强制顺序,Promise 创建时机决定并发或串行;真正串行需推迟 Promise 创建至 await 时刻,并用 for...of 而非 forEach 实现循环顺序执行。

await 本身不强制顺序,它只等待已存在的 Promise 完成;真正的顺序保障靠的是“何时创建 Promise”。很多人误以为写 await promiseX 就能让 promiseX “在那一刻才开始执行”,但事实是:Promise 构造器里的代码(比如 setTimeout、fetch、数据库调用)在 new Promise() 被调用时就同步运行了——和 await 毫无关系。
Promise 创建时机决定并发还是串行
如果两个 Promise 在函数开头就声明:
- 它们的异步操作(如定时器、网络请求)会立刻启动,彼此独立、并发执行
- 后续
await p1和await p2只是按顺序“收结果”,不代表 p2 是等 p1 结束后才发起的 - 结果输出顺序取决于各自耗时,而非代码书写顺序
要真正串行,得把 Promise 创建推迟到 await 时刻
把异步操作封装成函数,在 await 时才调用,才能确保前一个完成后再启动下一个:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 写成
async function fetchUser() { return fetch('/user').then(r => r.json()); } - 再用
const user = await fetchUser(); const posts = await fetchPosts(user.id); - 这样
fetchPosts的请求一定发生在fetchUser返回之后
循环中顺序执行必须用 for...of 或 for,不能用 forEach/map
数组方法如 forEach 不识别 async 回调,内部的 await 不会阻塞循环本身:
- ❌
list.forEach(async item => await api(item))→ 所有请求并发发出 - ✅
for (const item of list) { await api(item); }→ 逐个等待,严格串行 - 需要索引可用
for (let i = 0; i ,语义清晰且兼容好
错误处理要落在每次 await 内部
顺序执行下,一次失败默认中断流程。是否继续取决于业务逻辑:
- 想跳过失败项继续执行:给每个
await加独立try/catch - 想统一捕获并终止:整个循环外加一层
try/catch,但无法定位具体哪次出错 - 避免未处理的 rejection 导致静默失败或进程异常退出
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










