javascript 中的 async 函数通过返回 promise 并在其内部使用 await 关键字,将异步操作调度到事件循环的微任务队列(microtask queue)中执行。具体做法是在 async 函数体中遇到 await 时,当前同步代码会暂停,控制权交还给事件循环,等待 promise 状态改变后,该 async 函数的剩余部分会被作为微任务重新加入队列优先执行。这意味着 async/await 并非创建新的线程或宏任务,而是基于现有的 promise 机制和微任务调度模型来管理异步流程。

async 函数启动时的同步行为是什么
async 函数被调用时,其内部的代码会像普通函数一样立即同步执行,直到遇到第一个 await 表达式。此时,如果 await 后面是一个已经 resolved 的 Promise,则继续同步执行;如果是 pending 状态,则挂起当前 async 函数的执行上下文,并将后续代码包装成一个微任务。这种机制确保了 async 函数的入口是同步的,而内部逻辑则是异步调度的。

await 后的 Promise 状态如何影响调度顺序
当 await 等待的 Promise 从 pending 变为 fulfilled 或 rejected 时,事件循环会将该 async 函数剩余的代码作为一个微任务插入到微任务队列中。由于微任务队列的优先级高于宏任务(如 setTimeout),这些剩余代码会在当前宏任务结束前、下一个宏任务开始前被执行。因此,多个 await 语句之间的执行顺序严格遵循微任务的调度规则,保证了异步逻辑的顺序性和可预测性。
立即学习“Java免费学习笔记(深入)”;

连续多个 await 在同一个 async 函数中的执行表现
在一个 async 函数中,如果有多个 await 语句,它们会依次触发微任务的调度。例如,在以下代码中,第一个 await 等待完成后,第二个 await 才会被调度执行。这种链式调度使得开发者可以以同步代码的写法处理异步逻辑,但底层依然是基于事件循环的微任务机制。需要注意的是,如果 await 后面的 Promise 已经被 resolve,那么后续的代码会立即作为微任务加入队列,而不是等待下一个事件循环周期。


















