async/await 本质是用同步写法表达异步逻辑:async 函数自动将返回值包装为 Promise,await 暂停函数执行并等待 Promise 完成,支持串行、并行及混合调用,错误通过 try/catch 统一处理。

async 和 await 组合使用,本质是用同步的写法表达异步逻辑——代码从上到下线性书写,执行顺序也基本与视觉顺序一致,但底层仍是非阻塞的 Promise 机制。
async 函数声明:自动包装返回值为 Promise
只要在函数前加 async,它就变成异步函数,无论 return 什么,都会被自动转成 Promise:
-
return 普通值 → 等价于
Promise.resolve(值) -
throw 错误 → 等价于
Promise.reject(错误) - return Promise → 直接返回该 Promise,不额外包装
await 关键字:暂停当前函数,等待 Promise 完成
await 只能在 async 函数内使用,它的作用不是“阻塞线程”,而是“暂停当前 async 函数的执行”,把控制权交还给事件循环,等 Promise settled(fulfilled 或 rejected)后再恢复:
- 如果 Promise 成功,
await promise就得到 resolve 的值 - 如果 Promise 失败,
await promise就抛出错误,可被 try/catch 捕获 - await 后面可以跟任何值:Promise、普通值、null、undefined —— 非 Promise 值会被自动转成
Promise.resolve(值)
串行 vs 并行:控制并发的关键在 Promise 创建时机
写法看似同步,但性能差异巨大,关键看 Promise 是“提前创建”还是“逐个 await”:
立即学习“Java免费学习笔记(深入)”;
-
串行(耗时叠加):
await api.getUser(); await api.getPosts();→ 总耗时 ≈ 两者之和 -
并行(趋近最长项):
const [user, posts] = await Promise.all([api.getUser(), api.getPosts()]); -
混合模式:独立请求提前发,依赖项再 await,例如先调用
const userP = api.getUser(); const profile = await api.getProfile();,再const user = await userP;
错误处理:用 try/catch 替代 .catch 链
await 把 Promise rejection 转成同步风格的异常,因此推荐用标准 try/catch 包裹连续 await:
- 一个 try/catch 可覆盖多个 await,避免重复写捕获逻辑
- 注意:每个 await 都可能失败,不能假设前一个成功,后一个就一定安全
- 对非关键操作(如日志上报),可用
void (async () => { /* 忽略错误 */ })();避免影响主流程


















