Event Loop機制究竟是個啥

首先,咱們來看一下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

瀏覽器的Event loop

來看張圖
瀏覽器EventLoop處理模型spa

  1. 首先執行的是script任務,script任務是全局任務,屬於宏任務
  2. 宏任務執行完畢,開始執行全部的微任務
  3. 微任務執行完畢,再取任務隊列中的一個宏任務執行

可能只看這些仍是不清晰,那麼咱們再來一個例子。線程

console.log(1);
setTimeout(function() {
    console.log(2);
}, 0);
Promise.resolve().then(function() {
    console.log(3)
});
console.log(4);

你以爲這段代碼會怎麼輸出?翻譯

輸出結果:
1
4
3
2

爲何呢?

  1. 首先執行script全局任務,會輸出1,4
  2. script執行完,開始判斷微任務是否爲空。如今顯然有一個微任務Promise,那麼開始執行Promise,輸出3
  3. 執行完了Promise,微任務清空,微任務隊列就爲空了,而後從新渲染,再次判斷任務隊列中是否有任務
  4. 此時任務隊列中有setTimeout宏任務,開始執行,因而最後輸出2

這就是一個完整的過程。

一個Event loop有一個或多個任務隊列,每個Event loop只有一個微任務隊列

以上就是瀏覽器的Event loop

nodejs的Event loop

nodejs的event loop有6個階段:

  1. timers: 執行timers的回調
  2. pending callbacks:系統操做的回調
  3. idle,pepare:內部使用
  4. poll:等待新I/O事件
  5. check:執行setImmediate回調
  6. close callbacks:內部使用

以上這些階段,每個階段都有一個callback的先進先出的隊列須要執行,當event loop運行到指定階段時,該階段的fifo隊列將會被執行,當隊列callback執行完成或執行的callback數量超過該階段的上限時,event loop會轉入下一個階段。

這6個階段,咱們如今只關注3個,分別是timer,poll和check。

再來看個圖

Untitled Diagram (1).png

proccess.nextTick() 是一個異步的node API,可是不屬於event loop階段,調用時,event loop會停下來,先去執行這個方法的回調

相關文章
相關標籤/搜索