await 不会暂停函数执行,而是让出控制权,等 promise 解决后通过微任务队列继续执行;其本质是语法糖,底层基于 promise 和状态机,不阻塞线程,非 thenable 值会被自动 promise.resolve() 包装。

await 不会“暂停函数执行”,而是让出控制权,等 Promise 解决后再继续执行后续代码。 它看起来像同步暂停,实际是异步调度的语法糖,底层依赖 Promise 和微任务队列。
await 的本质:等待 Promise 状态变更
当 JS 遇到 await expression 时:
- 先求值
expression,必须返回一个 thenable(通常是 Promise); - 如果 Promise 已 fulfilled 或 rejected,直接用其结果继续(微任务中);
- 如果 Promise 还在 pending,当前 async 函数暂停(不阻塞主线程),控制权交还给事件循环;
- Promise 解决后,该 async 函数被放入微任务队列,等待本轮宏任务结束后执行后续语句。
它不阻塞线程,也不挂起栈帧
async 函数内部不是“冻结”或“保存现场”,而是被引擎自动编译为状态机(类似 Generator + Promise 链)。每次 await 相当于插入一个 .then() 分支:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
async function foo() {
console.log(1);
await Promise.resolve();
console.log(2);
}
等价于:
function foo() {
console.log(1);
return Promise.resolve().then(() => {
console.log(2);
});
}
常见误解澄清
-
不是 sleep:await 本身不计时,要暂停需配合
new Promise(r => setTimeout(r, ms)); -
不能 await 普通值:若 expression 是非 thenable(如数字、字符串),await 会立即 resolve 并继续(相当于
Promise.resolve(value)); - 错误会抛出:await 后的 Promise 被 reject,会像 throw 一样中断后续逻辑,可用 try/catch 捕获。
执行顺序直观示例
以下代码输出顺序是 1 → 3 → 2 → 4:
console.log(1);
async function test() {
console.log(2);
}
test(); // 立即返回 Promise,不等 console.log(2)
console.log(3);
await Promise.resolve();
console.log(4);
因为 async 函数体在微任务中执行,而 console.log(2) 属于那个微任务,晚于同步的 3,但早于 await 后的 4(后者在下一个微任务)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










