主线上的同步任务先执行,然后再执行微任务
主线上的同步任务先执行,然后再执行微任务,最后是宏任务
(特殊情况): 一般都是微任务先执行,然后再执行宏任务,但是在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,执行完微任务执行宏任务