首頁  >  文章  >  web前端  >  一文搞懂Node的事件循環

一文搞懂Node的事件循環

青灯夜游
青灯夜游轉載
2023-04-06 18:39:262554瀏覽

這篇文章聊聊Nodejs中的事件循環,希望帶大家去搞懂Nodejs中的事件循環,從此再也不怕面試官的靈魂發問:談談Nodejs的事件循環!

一文搞懂Node的事件循環

想必大家面試的時候,都會被面試官問:「談談Nodejs的事件循環吧」。

因為本人也被問過,但每次都很尷尬。

關於這個問題各種技術部落格上有很多介紹,但我一直都沒搞清楚。因為這些文章往往上來就是一大堆圖示、用語,瞬間澆熄了認知的勇氣。 【相關教學推薦:nodejs影片教學程式設計教學

但不能不懂啊,面試官還要問,於是流著淚、咬著牙,參考了一些教程,有了自己的總結,馬上分享給大家。

一、什麼是事件循環?

一句話:事件循環是Nodejs處理非同步操作的機制。

Js是單執行緒的,為什麼Nodejs就能處理非同步操作?

因為Nodejs把多執行緒的操作交給了系統核心。

上圖:

#Nodejs就像一個聰明的小孩,基於Js的它本身無法實作多執行緒操作,但是它把多執行緒的操作丟給了系統​​核心。

因為系統核心大部分都是多執行緒的,核心執行起來那不是so easy,那Nodejs就高枕無憂了嘛?

二、為什麼需要事件循環?

(先解釋一下事件循環這個名稱,Nodejs是事件驅動的,當什麼時候做什麼事情,做的事情就定義在回調函數中;

因此可以將回調函數定義為事件處理函數;所以管理回呼函數的機制叫做事件循環;)

既然核心那麼強大,Nodejs無事可做?

非也,核心執行完畢之後,Nodejs總得執行對應的回呼函數吧。

所以就需要一個機制來幫助它管理、維護這些非同步操作回呼函數,防止它們打架啊、亂串啊。

從而以一種有效率的方式執行。所以這就是為什麼需要---事件循環---。

總結:事件循環是Nodejs用來控制非同步程式碼回呼執行順序的!

三、怎麼理解事件循環?

? 口訣一:同步任務總是比非同步任務執行更早;

非同步API分類

同步任務無需多言,這裡先將Nodejs中的非同步API進行分類:

簡單理解,針對上述三種非同步API,事件循環內部提供了3種佇列,

奇怪?為什麼沒有process.nectTick?

哈哈,那是因為process.nectTick本身就很奇怪!

process.nectTick

雖然process.nectTick屬於非同步API,但不屬於事件循環的一部分。

上圖:

#這裡就牽涉到另一個概念:非同步模組!

非同步模組

就是這個神奇的傢伙,nodejs使用libuv函式庫呼叫內核,實作多執行緒的操作!

那這個跟process.nectTick有幾毛錢關係?

有,因為process.nectTick可以理解為非同步模組的一部分。

因此,process.nectTick總是會在事件循環之前被呼叫!

? 口訣二:process.nectTick是所有非同步任務裡面最快執行的;

(註:理解Tick

事件循環3種隊列運行一周,成為一個Tick!)

好,明白了!

等等......好像還缺了什麼? Promise又是怎麼執行的?

Promise

除了nextTick隊列,還有一個特殊的隊列:微任務隊列。微任務隊列,主要就是用來處理Promise回呼函數的執行。

那微任務佇列的執行順序又是怎麼樣的呢?

上圖:

? 口訣三:微任務佇列追加在process.nectTick佇列後面,事件循環的前面;

#上面講了這麼多,整體看下

? 口訣四:實踐出真知;

利用上面的理論,聰明的你,能分析一下最終的列印順序嘛?

console.log('同步代码')setImmediate(() => {    console.log('setImmediate');})setTimeout(() => {    console.log('setTimeout');}, 100)Promise.resolve().then(() => {    console.log('promise');})process.nextTick(() => {    console.log('Tick');})复制代码

那下次我們就結合具體的面試案例,看看它們的列印順序到底是怎麼樣。

更多node相關知識,請造訪:nodejs 教學

以上是一文搞懂Node的事件循環的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除