await 不等待时间,而是等待 Promise 状态变化;其“等待”实为将后续代码注册为微任务,真实耗时取决于右侧异步操作;多个 await 串行执行,总耗时为各任务之和;遇 rejected Promise 未捕获则立即终止函数。

await 不会“等待时间”,它等待的是 Promise 的状态变化。所谓“等待时间”,其实是异步操作(比如网络请求、定时器)内部耗时的体现,await 本身不引入延迟,只决定代码何时继续执行。
await 让后续代码进入微任务队列
只要函数体内出现 await,无论等的是 Promise 还是普通值,它后面的语句都会被推入微任务队列,不会在当前宏任务中立即运行。
- 即使写 await 123,控制权也会在当前同步代码跑完后才回到 await 后面那一行
- 这和 Promise.resolve().then(...) 行为一致,是事件循环机制决定的
- 视觉上像“暂停”,实则是把剩余逻辑注册为微任务,主线程立刻释放
真实耗时来自异步操作本身
await 的“等待时间”完全取决于它右边表达式所触发的异步行为:
- await fetch('/api') 的延迟由网络往返时间决定
- await new Promise(r => setTimeout(r, 2000)) 延迟就是 2 秒
- await 'hello' 没有真实延迟,只是让下一行异步执行
多个 await 是串行阻塞式等待
连续写多个 await,前一个没完成,后一个根本不会开始执行:
立即学习“Java免费学习笔记(深入)”;
- await taskA() → 完成后再执行 await taskB() → 再等 taskC()
- 总耗时 ≈ taskA + taskB + taskC 的执行时间之和
- 若想缩短总时间,应改用 Promise.all([taskA(), taskB(), taskC()]) 并行发起
错误发生时机影响执行流中断点
await 遇到 rejected Promise 时,若未捕获,会立即终止函数执行并返回 rejected Promise:
- await failingApi() 后面的代码不再运行
- try/catch 只能捕获被 await 显式等待的 Promise 错误
- 漏掉 await(如只写 fetch().then(...))会导致错误脱离 try/catch 范围


















