1. 程式人生 > 其它 >事件迴圈Event loop

事件迴圈Event loop

事件迴圈Event loop

主執行緒從"任務佇列"中讀取執行事件,這個過程是迴圈不斷的,這個機制被稱為事件迴圈。此機制具體如下:主 執行緒會不斷從任務佇列中按順序取任務執行,每執行完一個任務都會檢查microtask佇列是否為空(執行完一個 任務的具體標誌是函式執行棧為空),如果不為空則會一次性執行完所有microtask。然後再進入下一個迴圈去 任務佇列中取下一個任務執行。

詳細步驟:

1. 選擇當前要執行的巨集任務佇列,選擇一個最先進入任務佇列的巨集任務,如果沒有巨集任務可以選擇,則會 跳轉至microtask的執行步驟。

2. 將事件迴圈的當前執行巨集任務設定為已選擇的巨集任務。

3. 執行巨集任務。

4. 將事件迴圈的當前執行任務設定為null。

5. 將執行完的巨集任務從巨集任務佇列中移除。

6. microtasks步驟:進入microtask檢查點。

7. 更新介面渲染。

8. 返回第一步。

執行進入microtask檢查的的具體步驟如下:

1. 設定進入microtask檢查點的標誌為true。

2. 當事件迴圈的微任務佇列不為空時:選擇一個最先進入microtask佇列的microtask;設定事件迴圈的當 前執行任務為已選擇的microtask;執行microtask;設定事件迴圈的當前執行任務為null;將執行結束 的microtask從microtask佇列中移除。

3. 對於相應事件迴圈的每個環境設定物件(environment settings object),通知它們哪些promise為 rejected。

4. 清理indexedDB的事務。

5. 設定進入microtask檢查點的標誌為false。

需要注意的是:當前執行棧執行完畢時會立刻先處理所有微任務佇列中的事件, 然後再去巨集任務佇列中取出一個 事件。同一次事件迴圈中, 微任務永遠在巨集任務之前執行。