宏任務(wù)(macrotask?)和微任務(wù)(microtask?)
macrotask 和 microtask 表示異步任務(wù)的兩種分類。
在掛起任務(wù)時(shí),JS 引擎會(huì)將所有任務(wù)按照類別分到這兩個(gè)隊(duì)列中差购,首先在 macrotask 的隊(duì)列(這個(gè)隊(duì)列也被叫做 task queue)中取出第一個(gè)任務(wù),執(zhí)行完畢后取出 microtask 隊(duì)列中的所有任務(wù)順序執(zhí)行;之后再取 macrotask 任務(wù),周而復(fù)始吱涉,直至兩個(gè)隊(duì)列的任務(wù)都取完。
宏任務(wù)和微任務(wù)之間的關(guān)系:
宏任務(wù)與微任務(wù)
下面的圖會(huì)很清楚的告訴大家什么是宏任務(wù)及微任務(wù):
一道經(jīng)典的考察事件循環(huán)外里、宏任務(wù)怎爵、微任務(wù)的js題 :
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這不用說(shuō);
第二步執(zhí)行到setTimeout時(shí)盅蝗,它是一個(gè)宏任務(wù)鳖链,它會(huì)等當(dāng)前宏任務(wù)全部執(zhí)行完畢后再執(zhí)行;
第三步執(zhí)行到async1函數(shù)時(shí)墩莫,會(huì)先打印出async1 start芙委,然后打印出async2逞敷,因?yàn)閍sync定義的函數(shù)會(huì)立即執(zhí)行,async2會(huì)返回一個(gè)promise的微任務(wù)進(jìn)入回調(diào)隊(duì)列線程题山;
第四步執(zhí)行到new Promise時(shí)兰粉,會(huì)打印出promise1,同樣resolve()會(huì)返回一個(gè)微任務(wù)進(jìn)入回調(diào)隊(duì)列線程顶瞳;
第五步就打印出script end,到此時(shí)同步的都已經(jīng)執(zhí)行完畢愕秫,然后主線程會(huì)去回調(diào)隊(duì)列線程拉任務(wù)慨菱;
第六步主線程拉到第一個(gè)任務(wù)是async2返回的一個(gè)promise,又會(huì)碰到一個(gè)resolve()戴甩,這時(shí)又將其推入回調(diào)隊(duì)列線程符喝;
第七步拉到new Promise的resolve(),這時(shí)會(huì)打印出promise2甜孤;
第八步就是打印出async1 end协饲;
第九步就是當(dāng)前宏任務(wù)執(zhí)行完畢,執(zhí)行下一個(gè)宏任務(wù)setTimeout缴川,打印出setTimeout茉稠;