所謂微任務(wù)和宏任務(wù)
宏任務(wù)::常見的定時器,用戶交互事件等等帆精∩蚩螅可以理解是每次執(zhí)行棧執(zhí)行的代碼就是一個宏任務(wù)。(宏任務(wù)就是特定的這些個任務(wù),沒什么特殊含義)
微任務(wù): Promise相關(guān)任務(wù),MutationObserver等(一樣,只是一種稱呼而已!P鹱@峡汀)
到底先執(zhí)行微任務(wù)還是宏任務(wù)
第一個原則
萬物皆從全局上下文準備退出,全局的同步代碼運行結(jié)束的這個時機開始
function app() {
setTimeout(() = >{
console.log("1-1");
Promise.resolve().then(() = >{
console.log("2-1");
});
});
console.log("1-2");
Promise.resolve().then(() = >{
console.log("1-3");
setTimeout(() = >{
console.log("3-1");
});
});
}
app();
//1-2
//1-3
//1-1
//2-1
//3-1
當執(zhí)行完了console.log("1-2");的時候震叮,意味著全局的上下文馬上要退出了,因為此時全局的同步代碼都執(zhí)行完了,剩下的都是異步代碼
第二個原則
同一層級下胧砰,微任務(wù)永遠比宏任務(wù)先執(zhí)行,即Promise.then比setTimeout先執(zhí)行苇瓣,所以先打印1-3,再打印1-1
第三個原則
每個宏任務(wù),都單獨關(guān)聯(lián)了一個微任務(wù)隊列
每個層級的宏任務(wù),都對應(yīng)了他們的微任務(wù)隊列,微任務(wù)隊列遵循先進先出的原則,當全局同步代碼執(zhí)行完畢后,就開始執(zhí)行第一層的任務(wù)尉间。同層級的微任務(wù)永遠先于宏任務(wù)執(zhí)行,并且會在當前層級宏任務(wù)結(jié)束前全部執(zhí)行完畢。
console.log("游戲開始", 1);
new Promise((resolve) => {
console.log("promise", 2);
resolve();
}).then(() => {
console.log("then", 3);
});
console.log("promise結(jié)束", 4);
setTimeout(() => {
console.log("setTimeout", 5);
new Promise((resolve) => {
console.log("promise", 6);
resolve();
}).then(() => {
console.log("then", 7);
});
}, 0);
new Promise((resolve) => {
console.log("promise", 8);
resolve();
}).then(() => {
console.log("then", 9);
setTimeout(() => {
console.log("setTimeout", 10);
}, 0);
});
console.log("游戲結(jié)束", 11);