async/await是promise的语法糖,底层依赖promise状态流转;async函数必返回promise,await等价于promise.then链自动展开,错误处理对应promise.catch机制。

async/await 本身不是新机制,而是 Promise 的语法糖,底层完全依赖 Promise 对象和状态流转逻辑。它不改变异步本质,只是让开发者用同步写法表达异步流程。
async 函数返回值始终是 Promise
声明一个 async 函数时,JavaScript 引擎会自动将其包装成 Promise 构造函数的等价形式:
- 函数体中 return 的值(无论是否 await)都会被 Promise.resolve() 包裹;
- 函数内部抛出异常,等价于 Promise.reject();
- 即使函数里没有 await,也强制返回 Promise,比如
async function f() { return 42 }等价于function f() { return Promise.resolve(42) }。
await 表达式本质是 Promise.then 链的自动展开
遇到 await 时,引擎不会阻塞线程,而是将后续代码“切片”,作为 then 回调注册到当前 Promise 上:
-
let x = await p相当于p.then(value => { x = value }),并暂停当前 async 函数执行上下文; - 如果 p 不是 Promise,会被隐式转为
Promise.resolve(p); - await 后面的语句只有在 Promise fulfilled 后才继续执行,且恢复的是原 async 函数的执行栈(通过微任务队列调度)。
执行上下文靠状态机和微任务维持
编译器(如 V8)会把 async 函数编译成一个状态机,每个 await 是一个状态跳转点:
- 函数首次调用立即返回 Promise,并进入 pending 状态;
- await 触发后,当前状态保存,Promise.then 注册回调,控制权交还事件循环;
- Promise settled 后,微任务队列触发状态机恢复,继续执行下一段逻辑(可能再次 await)。
错误处理对应 Promise.catch 机制
try/catch 在 async 函数中捕获的是 Promise rejection,而非同步异常:
-
await p中 p 被 reject,等价于p.catch(e => { throw e }); - 未被捕获的 rejection 会触发 Promise 的 unhandledrejection 事件,行为与普通 Promise 一致;
- async 函数内部 throw 错误,等价于返回
Promise.reject(error)。
不复杂但容易忽略:async/await 没有引入新异步模型,它只是让 Promise 的链式调用更可读、更符合直觉。真正起作用的,还是 Promise 的三种状态(pending/fulfilled/rejected)、then/catch 注册机制,以及微任务队列的执行时机。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











