await 是异步语法糖,本质是等待 promise 兑现;非 promise 值自动包装为已兑现 promise,函数分段执行并交还控制权给事件循环,不阻塞主线程但暂停逻辑流,需用 try/catch 处理错误。

await 关键字不会真正“暂停”函数执行,而是让出控制权,等待 Promise 完成后再继续。它看起来像同步暂停,实际是异步机制的语法糖——底层仍是事件循环和 Promise 状态管理。
await 的本质是“等待 Promise 兑现”
当遇到 await expression 时:
- 如果
expression不是 Promise,会自动包装成已兑现的 Promise(即Promise.resolve(expression)) - 如果是 Promise,则等到它 fulfilled(成功)或 rejected(失败)才往下走
- 函数此时退出当前执行上下文,把控制权交还给事件循环,不阻塞主线程
async 函数内部是分段执行的
async 函数体被引擎拆成多个微任务片段:
- 遇到第一个
await前的代码同步执行 - 遇到
await后,函数暂停(实际是返回一个 pending Promise),后续代码被注册为该 Promise 的then回调 - Promise 兑现后,回调被加入微任务队列,等当前同步代码执行完再执行
例如:
async function f() {<br> console.log('1');<br> await Promise.resolve();<br> console.log('2');<br>}
输出顺序是
1 →(微任务)→ 2,中间可穿插其他微任务。
await 不会阻塞线程,但会“阻塞”当前 async 函数逻辑流
这是关键区别:
- 整个 JavaScript 是单线程的,没有真正“线程暂停”;
await只是让当前 async 函数的后续语句延迟到 Promise 结束后执行 - 其他代码(比如定时器、其他 Promise 回调、用户交互)仍可正常运行
- 若 await 的 Promise 长时间不兑现,函数就长时间“卡”在那句 await 上,但浏览器/Node.js 依然响应
错误处理必须配合 try/catch 或 .catch()
因为 await 会把 rejected Promise 转为抛出异常:
- 没加
try/catch会导致 async 函数返回 rejected Promise,可能引发未捕获异常 - 推荐写法:
try { const data = await fetch(...); } catch (err) { ... } - 也可用
.catch():await promise.catch(handleError),但不如 try/catch 直观











