1. 程式人生 > >正常任務(宏任務)和微任務

正常任務(宏任務)和微任務

interval 關於 順序 沒有 spm ask loop event 不同

最近突然被問到關於正常任務(宏任務)和微任務的問題,學習js這麽長時間來,還沒有註意到js的任務還有宏任務和微任務的區別,在網上查找以後大概知道了什麽是宏任務和微任務。

首先,宏任務包含:setTimeout/setInterval/setImmediate/整體代碼script

而微任務包含:promise和process.nextTick

從結果來說,兩者的區別在於在事件循環機制中,執行的機制不同,具體執行順序是這樣:

每次執行棧的同步任務執行完畢,就會去任務隊列中取出完成的異步任務,隊列中又分為microtasks queues和宏任務隊列等到把microtasks queues所有的microtasks

都執行完畢,註意是所有的,他才會從宏任務隊列中取事件。等到把隊列中的事件取出一個,放入執行棧執行完成,就算一次循環結束,之後event loop還會繼續循環,他會再去microtasks queues執行所有的任務,然後再從宏任務隊列裏面取一個,如此反復循環。

同步任務執行完

去執行microtasks,把所有microtasks queues清空

取出一個macrotasks queues的完成事件,在執行棧執行

再去執行microtasks

...

...

...

所以結果上來看,當有宏任務和微任務同時在隊列中時,微任務一般來說,執行的優先級較高,每次event loop都會清空一次微任務隊列,而每個宏任務都會觸發一次event loop

文章參考:https://yq.aliyun.com/articles/607031

正常任務(宏任務)和微任務