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