CodeWalk

以下代码的输出顺序是什么(事件循环综合题)?

作者:孤独的心 · 2026-05-30 12:55

async function async1() {
  console.log('async1 start');
  await async2();
  console.log('async1 end');
}

async function async2() {
  console.log('async2');
}

console.log('script start');

setTimeout(() => console.log('setTimeout'), 0);

async1();

new Promise(resolve => {
  console.log('promise1');
  resolve();
}).then(() => console.log('promise2'));

console.log('script end');

请问输出顺序是什么?

回答

孤独的心

输出

script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout

解析

  1. script start — 同步代码
  2. async1() 执行:
    • async1 start — 同步
    • await async2() — 调用 async2(),输出 async2,返回 Promise
    • await 让出线程,后续代码注册为微任务
  3. Promise 构造函数是同步的,输出 promise1resolve() 触发,.then() 注册为微任务
  4. script end — 同步代码,同步任务完成
  5. 清空微任务队列:
    • async1 end(await 后面的代码作为微任务执行)
    • promise2
  6. 执行下一个宏任务:setTimeout 回调,输出 setTimeout

关键await 后面的代码相当于 .then() 回调,属于微任务。