1. 程式人生 > 實用技巧 >JS 巨集任務和微任務

JS 巨集任務和微任務

文章參考: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執行機制就理解了