async/await 并非将异步变同步,而是通过语法糖封装 Promise,使异步代码写法和阅读逻辑线性直观;它不阻塞主线程,async 函数自动返回 Promise,await 暂停函数执行但不冻结线程,支持 try/catch 错误处理与线性流程控制。

async/await 并不是把异步操作变成同步执行,而是让异步代码的**写法和阅读逻辑像同步代码一样线性、直观**。它不阻塞主线程,也不改变 JavaScript 单线程、非阻塞的本质,只是通过语法糖封装了 Promise 的链式调用,把“等待结果”的语义显式表达出来。
async 函数返回 Promise,天然适配异步上下文
声明一个 async 函数,等价于自动把它返回值包装进 Promise.resolve()。即使你 return 一个普通值,它也会被转成已解决的 Promise:
-
async function foo() { return 42; }→ 调用foo()返回Promise<42> - 这使得它能无缝接入 Promise 生态(比如
.then()、Promise.all()),也方便被其他 async 函数 await
await 暂停函数执行,但不冻结线程
await 只在当前 async 函数内部起作用:遇到 await 时,函数暂停,控制权交还给事件循环;等右侧 Promise settle(fulfilled 或 rejected)后,再从暂停点继续执行。关键点是:
- 暂停的是函数体内的执行流,不是整个线程或 UI
- await 后面可以是 Promise,也可以是任意值(会被自动 Promise.resolve 包装)
- 多个 await 默认串行,但可通过
Promise.all()显式并发发起
错误处理回归 try/catch,不再依赖 .catch()
相比 Promise 链中必须用 .catch() 或末尾加 .catch() 捕获异常,async/await 允许直接用标准 try/catch 包裹 await 表达式:
try { const data = await fetch('/api'); } catch (err) { console.error(err); }- 异常传播路径清晰,嵌套层级扁平,更贴近同步代码的调试直觉
避免回调地狱,保持线性阅读顺序
当业务逻辑存在依赖关系(如:先登录,再用 token 获取用户信息,最后拉取订单列表),async/await 让步骤自然按从上到下的顺序书写:
- 不用嵌套
.then(),也不用层层传参 - 变量作用域干净,中间结果可直接赋值使用(
const token = await login();) - 逻辑分支(if/else)、循环(for/while)可直接包裹 await,无需额外 Promise 工具函数


















