async/await执行顺序面试题

本文通过一道面试题解析了async/await的执行顺序。首先,主代码块开始执行,接着遇到异步操作,将其放入宏任务队列。然后依次执行console.log(),并解析Promise。当遇到await时,它会暂停async函数的执行,将后续代码放入微任务队列。微任务队列清空后,继续执行宏任务中的剩余部分,最终输出完整的顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

async function async1 () {
  console.log('async1 start')
  await async2();
  console.log('async1 end')
}
 
async function async2 () {
  console.log('async2')
}
 
console.log('script start')
 
setTimeout(function () {
  console.log('setTimeout')
}, 0)
 
async1();
 
new Promise (function (resolve) {
  console.log('promise1')
  resolve();
}).then (function () {
  console.log('promise2')
})
 
console.log('script end')

结果:

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

解析:
先执行主代码块,所以第一行打印script start

setTimeout()是另一个宏任务,所以先放在宏任务队列。

然后执行async1async1里先打印async1 start
执行await async2 , 先执行async2,打印async2, 返回promise对象。await会阻塞async1后面的代码执行,所以先跳出来继续执行后面的代码。

然后执行new Promise 打印promise1
then里面的函数加入微任务队列

打印script end
到这里第一个宏任务执行完毕,开始执行微任务then,打印promise2

then执行完后,await才算是执行结束了,后面的代码不再被阻塞,所以打印async1 end
这时候继续执行第二个宏任务setTimeout,打印setTimeout

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值