async/await 是基于 Promise 的语法糖,使异步代码更简洁易读:async 函数自动返回 Promise 并支持 await;await 暂停函数执行直至 Promise settle;它简化结构、统一错误处理、提升调试体验,但不替代 Promise。

async 和 await 是 JavaScript 中处理异步操作的语法糖,建立在 Promise 之上,让异步代码写起来像同步代码一样自然,既不改变执行机制,又大幅降低理解与维护成本。
async 函数:自动包装成 Promise 的异步声明
在函数前加 async 关键字,就定义了一个 async 函数。它有三个关键特性:
- 函数体内部可使用 await(否则语法报错)
- 无论函数里 return 什么,返回值总是 Promise(哪怕 return 42,实际等价于 Promise.resolve(42))
- 函数内未捕获的异常会自动使返回的 Promise 进入 rejected 状态
await 表达式:暂停执行、等待 Promise 完成
await 只能在 async 函数内部使用,作用是“暂停当前函数执行,直到右侧的 Promise settle(即 resolve 或 reject),再继续往下走”:
- 如果 await 后面是一个已 resolve 的 Promise,它直接取出 value 并赋值
- 如果 Promise 被 reject,await 会抛出错误,需要用 try/catch 捕获
- await 不阻塞整个 JS 线程——其他任务(如事件、定时器)仍可执行,只是当前 async 函数暂停了
为什么能简化异步代码?核心在结构和错误处理
相比传统 Promise 链或回调嵌套,async/await 改变了代码组织方式:
立即学习“Java免费学习笔记(深入)”;
- 消除 .then().then().catch() 的链式缩进,逻辑平铺直叙,符合人脑阅读顺序
- 支持用标准 try/catch 捕获异步错误,不用分散写多个 .catch()
- 变量作用域更清晰——每个 await 结果可直接赋给常量,无需在 .then 回调里层层传递
- 调试友好——断点可以逐行停在 await 后面,不像 Promise 链中调试需跳转到不同 then 回调
它们不是替代 Promise,而是更好用的接口
async/await 本身不提供新能力,所有功能都依赖 Promise:
- await 后面必须是 Promise(或能被 Promise.resolve() 包装的值)
- async 函数返回 Promise,所以依然可以 .then()/.catch() 或传给 Promise.all()
- 遇到并行请求,仍需靠 Promise.all([await p1, await p2]) 或先发请求再 await ——不能盲目串行化











