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...