JS事件環eventloop

top
事件環分爲瀏覽器事件環和nodejs事件環

瀏覽器中的事件環

瀏覽器事件環

瀏覽器事件環簡單直接:當前棧執行完成(同步代碼主線程上執行完成)->清空微任務->宏任務隊列中的第一項推到棧中執行(若是有微任務,將微任務放入微任務隊列)->清空微任務隊列->宏任務第二項任務執行,依此循環,直到結束。node

微任務:Promise.then/mutationObesrve(process.nextTick是node纔有的) 宏任務:setTimeout、setInterval、setTmmediate(只兼容ie)、messageChannel瀏覽器

二、node的事件環

event loop的事件處理機制的運做方式。異步

當Node.js啓動時會初始化event loop, 每個event loop都會包含按以下順序六個循環階段,oop

  • 一、在libuv內部有這樣一個事件環機制。在node啓動時會初始化事件環。
  • 二、node中的event loop分爲6個階段,不一樣於瀏覽器的是,這裏每個階段都對應一個事件隊列,node會在當前階段中的所有任務執行完,清空NextTick Queue,清空Microtask Queue,再執行下一階段。
  • 三、在node.js裏,process 對象表明node.js應用程序,能夠獲取應用程序的用戶,運行環境等各類信息。process.nextTick()方法將 callback 添加到next tick 隊列,而且nextTick優先級比Promise.then等微任務高。
    node事件環

每個階段都對應一個事件隊列,當event loop執行到某個階段時會將當前階段對應的隊列依次執行。當隊列執行完畢或者執行的數量超過上線時,會轉入下一個階段。node事件環跟瀏覽器的事件環相似惟一不一樣的是它是把隊列的執行完才執行下個隊列。(Node是按照六個階段執行,每一個階段切換時,再執行MicroTask微任務隊列)測試

每個階段都有一個裝有callbacks的隊列,當event loop運行到一個指定階段時, node將執行該階段的隊列,當隊列callback執行完或者執行callbacks數量超過該階段的上限時, event loop會轉入下一下階段.線程

poll 階段

poll 階段,是整個event loop中的最重要承接階段:在node.js裏,任何異步方法(除timer,close,setImmediate以外)完成時,都會將其callback加到poll queue裏,並當即執行。3d

poll 階段有兩個主要的功能:cdn

  • 處理poll隊列(poll quenue)的事件(callback);
  • 執行timers的callback,當到達timers指定的時間時;

若是event loop進入了 poll階段,且代碼未設定timer,將會發生下面狀況:對象

  • 一、若是poll queue不爲空,event loop將同步的執行queue裏的callback,直至queue爲空,或執行的callback到達系統上限;blog

  • 二、若是poll queue爲空,將會發生下面狀況:

    • 若是代碼已經被setImmediate()設定了callback, event loop將結束poll階段進入check階段,並執行check階段的queue (check階段的queue是 setImmediate設定的)
    • 若是代碼沒有設定setImmediate(callback),event loop將阻塞在該階段等待callbacks加入poll queue; 若是event loop進入了 poll階段,且代碼設定了timer:
  • 三、若是poll queue進入空狀態時(即poll 階段爲空閒狀態),event loop將檢查timers,若是有1個或多個timers時間時間已經到達,event loop將按循環順序進入 timers 階段,並執行timer queue.

以上即是整個event loop時間循環的各個階段運行機制。

待會兒上測試代碼~

相關文章
相關標籤/搜索