微任務,巨集任務順序

2022-06-08 11:36:10 字數 1562 閱讀 1612

js中整個迴圈當中,僅存在乙個《》

理解一下概念問題 微任務,巨集任務

巨集任務需要多次事件迴圈才能執行完,微任務是一次性執行完的;

2.巨集任務macrotask:

(事件佇列中的每乙個事件都是乙個macrotask)

優先順序:主**塊 > setimmediate > messagechannel > settimeout / setinterval

比如:setimmediate指定的**函式,總是排在settimeout前面

3.微任務包括:

優先順序:process.nexttick > promise > mutationobserver

需要多注意  process.nexttick 永遠大於 promise.then,

原因其實很簡單

在node中,_tickcallback在每一次執行完taskqueue中的乙個任務後被呼叫,而這個_tickcallback中實質上幹了兩件事:

1.nexttickqueue中所有任務執行掉(長度最大1e4,node版本v6.9.1)

2.第一步執行完後執行_runmicrotasks函式,執行microtask中的部分(promise.then註冊的**)

盜一張圖:

但是js非同步有乙個機制,就是遇到巨集任務,先執行巨集任務,將巨集任務放入eventqueue,然後在執行微任務,將微任務放入eventqueue,

這兩個queue不是乙個queue。當你往外拿的時候先從微任務裡拿這個回掉函式,然後再從巨集任務的queue上拿巨集任務的回掉函式。 

這張圖可以看出:

存在微任務的話,那麼就執行所有的微任務

微任務都執行完之後,執行第乙個巨集任務,

迴圈 1, 2

這樣 可以總結一下如何分析非同步執行的順序:

首先我們分析有多少個巨集任務;

在每個巨集任務中,分析有多少個微任務;

根據呼叫次序,確定巨集任務中的微任務執行次序;

根據巨集任務的觸發規則和呼叫次序,確定巨集任務的執行次序;

下面做個測試:

測試結果為:   1->5->6->2->3->4->7->8->9

如果上面實在node 環境中

測試結果為:   1->5->6->2->3-->7->8->4->9

settimeout內部**函式執行順序在瀏覽器環境與node環境是有差異的。

1.瀏覽器環境是執行完setimeout內部**函式內容

第乙個settimeout中的「2 3 4」先與第二個settimeout中的「7 8 9」列印。

2.node環境中settimeout內部如果還有非同步操作,直接跳到下乙個settimeout****中。至於兩個settimeout中promose.then內部的執行順去取決於微任務的入隊順序

巨集任務和微任務

概念 1.巨集任務 當前呼叫棧中執行的 成為巨集任務。主 快,定時器等等 3.巨集任務中的事件放在callback queue中,由事件觸發執行緒維護 微任務的事件放在微任務佇列中,由js引擎執行緒維護。執行機制02 1.在執行棧中執行乙個巨集任務。2.執行過程中遇到微任務,將微任務新增到微任務佇列...

巨集任務與微任務

之前我們討論過js 執行的同步和非同步,js的單執行緒執行機制不會改變 但是僅僅懂得同步非同步是遠遠不夠的 比如說下面這些 1 settimeout function 4new promise function resolve,reject then function 10 console.log ...

巨集任務和微任務

1.巨集任務 分類 settimeout setinterval requrestanimationframe 1 巨集任務所處的佇列就是巨集任務佇列 2 第乙個巨集任務列中只有乙個任務,執行主線程的js 3 巨集任務佇列可以有多個 2.微任務 分類 new promise then process...