首先,咱們來看一下event loop是幹嗎用的。node
好比,如今執行了一個2s的setTimeout,瀏覽器主線程執行,而後調用web API中的setTimeout,接下來瀏覽器的定時器線程開始計數,2s以後,事件觸發線程開始處理setTimeout的回調函數,把這個回調函數扔到任務隊列中,此時,event loop開始執行任務隊列。因此,event loop能夠理解成是來執行任務隊列的。web
在開始介紹event loop以前,還須要瞭解兩個概念,就是宏任務和微任務。瀏覽器
宏任務和微任務是異步任務的兩種分類:
宏任務包括script,setTimeout/setInterval,setImmediate,I/O和UI rendering;
而微任務包括了Promise,Object.observe,Mutation.Observer和postMessage。異步
知道它是幹嗎用的,又知道了宏任務和微任務,那麼咱們來看看它究竟是個啥。函數
Event loop,按照字面意思翻譯就是 事件循環。事件,就是處理異步任務,處理宏任務和微任務,而循環就是循環去處理。那麼它是怎麼樣處理的呢?oop
如今js的執行環境主要有兩個,一個是瀏覽器,一個是nodejs,這兩個環境中都有對應的event loop。下面咱們分開來講。post
來看張圖
spa
可能只看這些仍是不清晰,那麼咱們再來一個例子。線程
console.log(1); setTimeout(function() { console.log(2); }, 0); Promise.resolve().then(function() { console.log(3) }); console.log(4);
你以爲這段代碼會怎麼輸出?翻譯
輸出結果: 1 4 3 2
爲何呢?
這就是一個完整的過程。
一個Event loop有一個或多個任務隊列,每個Event loop只有一個微任務隊列
以上就是瀏覽器的Event loop
nodejs的event loop有6個階段:
以上這些階段,每個階段都有一個callback的先進先出的隊列須要執行,當event loop運行到指定階段時,該階段的fifo隊列將會被執行,當隊列callback執行完成或執行的callback數量超過該階段的上限時,event loop會轉入下一個階段。
這6個階段,咱們如今只關注3個,分別是timer,poll和check。
再來看個圖
proccess.nextTick() 是一個異步的node API,可是不屬於event loop階段,調用時,event loop會停下來,先去執行這個方法的回調