JS 巨集任務和微任務
阿新 • • 發佈:2020-09-07
文章參考:https://www.cnblogs.com/wangziye/p/9566454.html
巨集任務(macrotask)
微任務(microtask)
macrotask 和 microtask 表示非同步任務的兩種分類,他們都是非同步任務
在掛起任務時,JS 引擎會將所有任務按照類別分到這兩個佇列中,首先在 macrotask 的佇列(這個佇列也被叫做 task queue)中取出第一個任務,執行完畢後取出 microtask 佇列中的所有任務順序執行;之後再取 macrotask 任務,周而復始,直至兩個佇列的任務都取完。
巨集任務和微任務之間的關係
先看個例子
setTimeout(() => { //執行後 回撥一個巨集事件 console.log('內層巨集事件3') }, 0) console.log('外層巨集事件1'); new Promise((resolve) => { console.log('外層巨集事件2'); resolve() }).then(() => { console.log('微事件1'); }).then(()=>{ console.log('微事件2') })
我們看看列印結果
外層巨集事件1 外層巨集事件2 微事件1 微事件2 內層巨集事件3
• 首先瀏覽器執行js進入第一個巨集任務進入主執行緒, 遇到setTimeout分發到巨集任務Event Queue中
• 遇到console.log()直接執行 輸出 外層巨集事件1
• 遇到Promise, newPromise直接執行 輸出 外層巨集事件2
• 執行then被分發到微任務Event Queue中
•第一輪巨集任務執行結束,開始執行微任務 列印 '微事件1' '微事件2'
•第一輪微任務執行完畢,執行第二輪巨集事件,列印setTimeout裡面內容'內層巨集事件3'
巨集任務
# | 瀏覽器 | Node |
setTimeout | √ | √ |
setInterval | √ | √ |
setImmediate | x | √ |
requestAnimationFrame | √ | x |
微任務
# | 瀏覽器 | Node |
process.nextTick | x | √ |
MutationObserver | √ | x |
Promise.then catch finally | √ | √ |
這個例子看懂基本js執行機制就理解了