瀏覽器事件環簡單直接:當前棧執行完成(同步代碼主線程上執行完成)->清空微任務->宏任務隊列中的第一項推到棧中執行(若是有微任務,將微任務放入微任務隊列)->清空微任務隊列->宏任務第二項任務執行,依此循環,直到結束。node
微任務:Promise.then/mutationObesrve(process.nextTick是node纔有的) 宏任務:setTimeout、setInterval、setTmmediate(只兼容ie)、messageChannel瀏覽器
event loop的事件處理機制的運做方式。異步
當Node.js啓動時會初始化event loop, 每個event loop都會包含按以下順序六個循環階段,oop
每個階段都對應一個事件隊列,當event loop執行到某個階段時會將當前階段對應的隊列依次執行。當隊列執行完畢或者執行的數量超過上線時,會轉入下一個階段。node事件環跟瀏覽器的事件環相似惟一不一樣的是它是把隊列的執行完才執行下個隊列。(Node是按照六個階段執行,每一個階段切換時,再執行MicroTask微任務隊列)測試
每個階段都有一個裝有callbacks的隊列,當event loop運行到一個指定階段時, node將執行該階段的隊列,當隊列callback執行完或者執行callbacks數量超過該階段的上限時, event loop會轉入下一下階段.線程
poll 階段,是整個event loop中的最重要承接階段:在node.js裏,任何異步方法(除timer,close,setImmediate以外)完成時,都會將其callback加到poll queue裏,並當即執行。3d
poll 階段有兩個主要的功能:cdn
若是event loop進入了 poll階段,且代碼未設定timer,將會發生下面狀況:對象
一、若是poll queue不爲空,event loop將同步的執行queue裏的callback,直至queue爲空,或執行的callback到達系統上限;blog
二、若是poll queue爲空,將會發生下面狀況:
三、若是poll queue進入空狀態時(即poll 階段爲空閒狀態),event loop將檢查timers,若是有1個或多個timers時間時間已經到達,event loop將按循環順序進入 timers 階段,並執行timer queue.
以上即是整個event loop時間循環的各個階段運行機制。
待會兒上測試代碼~