宏任務(wù)與微任務(wù)
// ?此文件為JS文件 ?需要在nodejs環(huán)境運行
const { rejects } = require("assert")
const { resolve } = require("path")
// js代碼是單線程的 ?在主線程上運行 ?如果代碼是異步的 那么一般會有一個回調(diào)函數(shù) ?不同的異步任務(wù)對應(yīng)不同的回調(diào) 比如計時器 Ajax
// 不同的回調(diào)會交給不同的模塊去處理
// 宏任務(wù)
// ? ? 分類:setInterval ? setTimeout ?requestAnimationFrame(用于告訴瀏覽器在下個動畫前調(diào)用回調(diào)函數(shù))
// ? ? 1.宏任務(wù)所處的隊列就是宏任務(wù)隊列
// ? ? 2.宏任務(wù)隊列可以有多個
// ? ? 3.第一個宏任務(wù)隊列中只有一個任務(wù):執(zhí)行主線程的js
// ? ? 4.第一個宏任務(wù)隊列中的所有任務(wù)全部執(zhí)行完成,查看是否有微任務(wù)隊列,如果有,先執(zhí)行微任務(wù)隊列中的所有任務(wù),如果沒有,就查看是否有其他宏任務(wù)隊列
// 微任務(wù)
// ? ? 分類:new Promise().then(回調(diào)) ?process.nextTick()
// ? ? 1.微任務(wù)所處的隊列就是微任務(wù)隊列
// ? ? 2.只有一個微任務(wù)隊列
// ? ? 3.在上一個宏任務(wù)隊列執(zhí)行完畢后,如果有微任務(wù)隊列,就會執(zhí)行微任務(wù)隊列中的所有任務(wù)
console.log('---------start-----------')
setTimeout(function(){
? ? console.log("setTimeout被執(zhí)行")
},0)
new Promise((resolve,reject)=>{
? ? for(var i=0;i<5;i++){
? ? ? ? console.log(i)
? ? }
? ? resolve();
}).then(()=>{
? ? console.log('promise實例成功回調(diào)執(zhí)行')
})
console.log('----------end-----------')
// 輸出結(jié)果為:
// ---------start-----------
// 0
// 1
// 2
// 3
// 4
// ----------end-----------
// promise實例成功回調(diào)執(zhí)行
// setTimeout被執(zhí)行
// 原理:
// 第一個宏任務(wù)隊列 ? ? ? ? ? ? ? ? ? 第二個宏任務(wù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?微任務(wù)
// 執(zhí)行主線程上代碼 ? ? ? ? ? ? ? ? ? setTimeout ? ? ? ? ? ? ? ? ? ? ? ? ? ?new Promise().then
// 注意:new Promise() 這個過程是同步的 ?.then()才是異步的
// ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 宏任務(wù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?微任務(wù)
// 誰發(fā)起的 ? ? ? ? ? ? ? ? ?宿主(Node,瀏覽器) ? ? ? ? ? ? ? ? ? ? ? js引擎
// 具體事件 ? ? ? ? ? ? ? ? ?scrpit (可以理解為外層同步代碼) ? ? ? ? ? ?Promise.then()
// ? ? ? ? ? ? ? ? ? ? ? ? setTimeout/setInterval ? ? ? ? ? ? ? ? ? ?process.nextTick()
// ? ? ? ? ? ? ? ? ? ? ? ? UI rendering/ UI事件 ? ? ? ? ? ? ? ? ? ? ?MutaionObserver
// ? ? ? ? ? ? ? ? ? ? ? ? postMessage,MessageChannel ? ? ? ? ? ? ?
// ? ? ? ? ? ? ? ? ? ? ? ? setImmediate
// 誰先運行 ? ? ? ? ? ? ? ? ? ? ? ? 后運行(不考慮主線程) ? ? ? ? ? ? ? ? ?先運行
// 會觸發(fā)新一輪的Tick么 ? ? ? ? ? ? ?會 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?不會