溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Node的事件循環(huán)是什么

發(fā)布時(shí)間:2023-04-07 09:33:57 來(lái)源:億速云 閱讀:114 作者:iii 欄目:web開(kāi)發(fā)

這篇文章主要介紹“Node的事件循環(huán)是什么”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Node的事件循環(huán)是什么”文章能幫助大家解決問(wèn)題。

一、什么是事件循環(huán)

一句話:事件循環(huán)是Nodejs處理異步操作的機(jī)制。

Js是單線程的,為什么Nodejs就能處理異步操作?

因?yàn)镹odejs把多線程的操作交給了系統(tǒng)內(nèi)核。

上圖:

Node的事件循環(huán)是什么

Node的事件循環(huán)是什么

Nodejs就像一個(gè)聰明的小孩,基于Js的它本身無(wú)法實(shí)現(xiàn)多線程操作,但是它把多線程的操作丟給了系統(tǒng)內(nèi)核。

因?yàn)橄到y(tǒng)內(nèi)核大部分都是多線程的,內(nèi)核執(zhí)行起來(lái)那不是so easy,那Nodejs就高枕無(wú)憂了嘛?

二、為什么需要事件循環(huán)

(先解釋一下事件循環(huán)這個(gè)名稱,Nodejs是事件驅(qū)動(dòng)的,當(dāng)什么時(shí)候 做什么事情,做的事情就定義在回調(diào)函數(shù)中;

因此可以將回調(diào)函數(shù)定義為事件處理函數(shù);所以管理回調(diào)函數(shù)的機(jī)制叫做事件循環(huán);)

既然內(nèi)核那么強(qiáng)大,Nodejs無(wú)事一身輕?

非也,內(nèi)核執(zhí)行完畢之后,Nodejs總得執(zhí)行對(duì)應(yīng)的回調(diào)函數(shù)吧。

所以就需要一個(gè)機(jī)制幫助它管理、維護(hù)這些異步操作回調(diào)函數(shù),防止它們打架啊、亂串啊。

從而以一種高效的方式執(zhí)行。所以這就是為什么需要---事件循環(huán)---。

Node的事件循環(huán)是什么

總結(jié):事件循環(huán)是Nodejs用來(lái)控制異步代碼回調(diào)執(zhí)行順序的!

三、怎樣理解事件循環(huán)

口訣一:同步任務(wù)總是比異步任務(wù)執(zhí)行更早;

異步API分類

同步任務(wù)無(wú)需多言,這里先將Nodejs中的異步API進(jìn)行分類:

Node的事件循環(huán)是什么

簡(jiǎn)單理解,針對(duì)上述三種異步API,事件循環(huán)內(nèi)部提供了3種隊(duì)列,

Node的事件循環(huán)是什么

奇怪?為什么沒(méi)有process.nectTick?

哈哈,那是因?yàn)閜rocess.nectTick本身就很奇怪!

process.nectTick

雖然process.nectTick屬于異步API,但是卻不屬于事件循環(huán)的一部分。

上圖:

Node的事件循環(huán)是什么

這里就牽涉到另一個(gè)概念:異步模塊!

異步模塊

Node的事件循環(huán)是什么

就是這個(gè)神奇的家伙,nodejs使用libuv庫(kù)調(diào)用內(nèi)核,實(shí)現(xiàn)多線程的操作!

那這個(gè)跟process.nectTick有幾毛錢關(guān)系?

有,因?yàn)閜rocess.nectTick可以理解為異步模塊的一部分。

Node的事件循環(huán)是什么

因此,process.nectTick總會(huì)在事件循環(huán)之前被調(diào)用!

口訣二:process.nectTick是所有異步任務(wù)里面最快執(zhí)行的;

(注:理解Tick

Node的事件循環(huán)是什么

事件循環(huán)3種隊(duì)列運(yùn)行一周,成為一個(gè)Tick!)

好,明白了!

等等......好像還缺少了什么?Promise又是怎么執(zhí)行的?

Promise

除了nextTick隊(duì)列,還有一種特殊的隊(duì)列:微任務(wù)隊(duì)列。微任務(wù)隊(duì)列,主要就是用來(lái)處理Promise回調(diào)函數(shù)的執(zhí)行。

那微任務(wù)隊(duì)列的執(zhí)行順序又是怎樣的呢?

上圖:

Node的事件循環(huán)是什么

口訣三:微任務(wù)隊(duì)列追加在process.nectTick隊(duì)列后面,事件循環(huán)的前面;

上面講了這么多,整體看下

Node的事件循環(huán)是什么

口訣四:實(shí)踐出真知;

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

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

關(guān)于“Node的事件循環(huán)是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI