事件循环:浅浅了解宏、微任务的执行顺序

主线上的同步任务先执行,然后再执行微任务 

主线上的同步任务先执行,然后再执行微任务,最后是宏任务

(特殊情况): 一般都是微任务先执行,然后再执行宏任务,但是在promise里面的宏任务函数,必须先执行完,才能往下执行

async function async1 () {
  console.log(1);
  const result = await async2();
  console.log(3);
}
async function async2 () {
  console.log(2);
}
Promise.resolve().then(() => {
  console.log(4);
});
setTimeout(() => {
  console.log(5);
});
async1();
console.log(6);
结果:
1
2
6
4
3
5

依次看代码,未执行的先别看, Promise.resolve().then(() ...微任务,放进堆中;setTimeout宏任务放进堆中,执行async1,回去看async1,输出1;await会隐式的生成promise,将后面的代码放进promise.then中,并执行本身,所以输出2,将3放进堆中;接着往下执行,输出6;3和4都为then,看代码执行顺序,所以是4,3;最后是宏任务5

setTimeout(function () {
  console.log('1');
});
async function test () {
  console.log('5')
  //隐式创建一个微任务 promise.then()
  await async2();
  console.log('6')
}
new Promise(function (resolve) {
  console.log('2');
  resolve();
}).then(function () {
  console.log('3');
}).finally(() => {
  console.log('8');
})
function async2 () {
  console.log('7');
}
test()
console.log('4');
结果:2、5、7、4、3、6、8、1

setTimeout宏任务放进堆中,test未执行先别看;进入Promise输出2,遇到回调函数(微任务)放进堆中,往下走async2未执行继续往下走,执行test输出5,await紧跟的函数立即执行,隐式生成一个promise,后面的代码包裹在promise.then中成为微任务放进堆中,执行完test继续往下走,输出4,执行完代码回到堆中执行微任务,微任务根据代码的执行顺序依次执行,then的优先级大于finally(finally和async创建的.then属于第一次回调一个层级的
,finally后面的.then已经是第二次回调了所以放在下一级微任务里了)所以先输出3,6再输出8,执行完微任务执行宏任务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值