正常任務(宏任務)和微任務
阿新 • • 發佈:2018-07-09
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
正常任務(宏任務)和微任務