一区二区三区中文国产亚洲_另类视频区第一页_日韩精品免费视频_女人免费视频_国产综合精品久久亚洲

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > Node中的Event Loop和瀏覽器中的有什么區(qū)別?process.nextTick 執(zhí)行順序?

Node中的Event Loop和瀏覽器中的有什么區(qū)別?process.nextTick 執(zhí)行順序?

來源:千鋒教育
發(fā)布人:wjy
時(shí)間: 2022-10-19 16:59:43 1666169983

  Node 中的 Event Loop 和瀏覽器中的是完全不相同的東西。

  Node 的 Event Loop 分為 6 個(gè)階段,它們會(huì)按照順序反復(fù)運(yùn)行。每當(dāng)進(jìn)入某一個(gè)階段的時(shí)候,都會(huì)從對(duì)應(yīng)的回調(diào)隊(duì)列中取出函數(shù)去執(zhí)行。當(dāng)隊(duì)列為空或者執(zhí)行的回調(diào)函數(shù)數(shù)量到達(dá)系統(tǒng)設(shè)定的閾值,就會(huì)進(jìn)入下一階段。

Node 中的 Event Loop 和瀏覽器中的有什么區(qū)別1

  (1)Timers(計(jì)時(shí)器階段):初次進(jìn)入事件循環(huán),會(huì)從計(jì)時(shí)器階段開始。此階段會(huì)判斷是否存在過期的計(jì)時(shí)器回調(diào)(包含 setTimeout 和 setInterval),如果存在則會(huì)執(zhí)行所有過期的計(jì)時(shí)器回調(diào),執(zhí)行完畢后,如果回調(diào)中觸發(fā)了相應(yīng)的微任務(wù),會(huì)接著執(zhí)行所有微任務(wù),執(zhí)行完微任務(wù)后再進(jìn)入 Pending callbacks 階段。

  (2)Pending callbacks:執(zhí)行推遲到下一個(gè)循環(huán)迭代的I / O回調(diào)(系統(tǒng)調(diào)用相關(guān)的回調(diào))。

  (3)Idle/Prepare:僅供內(nèi)部使用。

  (4)Poll(輪詢階段):

  當(dāng)回調(diào)隊(duì)列不為空時(shí):會(huì)執(zhí)行回調(diào),若回調(diào)中觸發(fā)了相應(yīng)的微任務(wù),這里的微任務(wù)執(zhí)行時(shí)機(jī)和其他地方有所不同,不會(huì)等到所有回調(diào)執(zhí)行完畢后才執(zhí)行,而是針對(duì)每一個(gè)回調(diào)執(zhí)行完畢后,就執(zhí)行相應(yīng)微任務(wù)。執(zhí)行完所有的回調(diào)后,變?yōu)橄旅娴那闆r。

  當(dāng)回調(diào)隊(duì)列為空時(shí)(沒有回調(diào)或所有回調(diào)執(zhí)行完畢):但如果存在有計(jì)時(shí)器(setTimeout、setInterval和setImmediate)沒有執(zhí)行,會(huì)結(jié)束輪詢階段,進(jìn)入 Check 階段。否則會(huì)阻塞并等待任何正在執(zhí)行的I/O操作完成,并馬上執(zhí)行相應(yīng)的回調(diào),直到所有回調(diào)執(zhí)行完畢。

  (5)Check(查詢階段):會(huì)檢查是否存在 setImmediate 相關(guān)的回調(diào),如果存在則執(zhí)行所有回調(diào),執(zhí)行完畢后,如果回調(diào)中觸發(fā)了相應(yīng)的微任務(wù),會(huì)接著執(zhí)行所有微任務(wù),執(zhí)行完微任務(wù)后再進(jìn)入 Close callbacks 階段。

  (6)Close callbacks:執(zhí)行一些關(guān)閉回調(diào),比如socket.on('close', ...)等。

  下面來看一個(gè)例子,首先在有些情況下,定時(shí)器的執(zhí)行順序其實(shí)是隨機(jī)的

Node 中的 Event Loop 和瀏覽器中的有什么區(qū)別2

  對(duì)于以上代碼來說,setTimeout 可能執(zhí)行在前,也可能執(zhí)行在后首先 setTimeout(fn, 0) === setTimeout(fn, 1),這是由源碼決定的進(jìn)入事件循環(huán)也是需要成本的,如果在準(zhǔn)備時(shí)候花費(fèi)了大于 1ms 的時(shí)間,那么在 timer 階段就會(huì)直接執(zhí)行 setTimeout 回調(diào)那么如果準(zhǔn)備時(shí)間花費(fèi)小于 1ms,那么就是 setImmediate 回調(diào)先執(zhí)行了當(dāng)然在某些情況下,他們的執(zhí)行順序一定是固定的,比如以下代碼:

Node 中的 Event Loop 和瀏覽器中的有什么區(qū)別3

  在上述代碼中,setImmediate 永遠(yuǎn)先執(zhí)行。因?yàn)閮蓚€(gè)代碼寫在 IO 回調(diào)中,IO 回調(diào)是在 poll 階段執(zhí)行,當(dāng)回調(diào)執(zhí)行完畢后隊(duì)列為空,發(fā)現(xiàn)存在 setImmediate 回調(diào),所以就直接跳轉(zhuǎn)到 check 階段去執(zhí)行回調(diào)了。

  上面都是 macrotask 的執(zhí)行情況,對(duì)于 microtask 來說,它會(huì)在以上每個(gè)階段完成前清空 microtask 隊(duì)列,下圖中的 Tick 就代表了 microtask

Node 中的 Event Loop 和瀏覽器中的有什么區(qū)別4

Node 中的 Event Loop 和瀏覽器中的有什么區(qū)別5

  對(duì)于以上代碼來說,其實(shí)和瀏覽器中的輸出是一樣的,microtask 永遠(yuǎn)執(zhí)行在 macrotask 前面。最后來看 Node 中的 process.nextTick,這個(gè)函數(shù)其實(shí)是獨(dú)立于 Event Loop 之外的,它有一個(gè)自己的隊(duì)列,當(dāng)每個(gè)階段完成后,如果存在 nextTick 隊(duì)列,就會(huì)清空隊(duì)列中的所有回調(diào)函數(shù),并且優(yōu)先于其他 microtask 執(zhí)行。

Node 中的 Event Loop 和瀏覽器中的有什么區(qū)別6

  對(duì)于以上代碼,永遠(yuǎn)都是先把 nextTick 全部打印出來。

tags:
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
大數(shù)據(jù)測(cè)試工程師需要具備哪些技能?

一、理解大數(shù)據(jù)概念大數(shù)據(jù)測(cè)試工程師需要理解大數(shù)據(jù)的基本概念和原理,如分布式存儲(chǔ)、MapReduce、實(shí)時(shí)計(jì)算等。他們還需要了解如何處理大規(guī)模的...詳情>>

2023-10-14 23:43:03
為什么SpringBoot的 jar 可以直接運(yùn)行?

一、JAR文件的結(jié)構(gòu)與執(zhí)行方式Spring Boot的JAR包是Java Archive的縮寫,它是一種壓縮文件格式,可以將Java項(xiàng)目的類文件、資源文件以及依賴庫(kù)等...詳情>>

2023-10-14 23:01:49
站群服務(wù)器是什么?

站群服務(wù)器的含義與用途站群服務(wù)器主要用于支持站群,即由一組相互鏈接的網(wǎng)站組成的群體。這些網(wǎng)站通常由同一組織或個(gè)人擁有,并且經(jīng)常會(huì)互相鏈...詳情>>

2023-10-14 22:46:12
自編碼器是什么?

一、自編碼器原理自編碼器的設(shè)計(jì)靈感源于神經(jīng)科學(xué)中關(guān)于感知系統(tǒng)的認(rèn)知原理,它的核心思想是將輸入數(shù)據(jù)經(jīng)過編碼過程,形成一個(gè)隱藏層的特征表示...詳情>>

2023-10-14 22:41:10
什么是云網(wǎng)融合?

一、云網(wǎng)融合的定義云網(wǎng)融合是指將云計(jì)算與網(wǎng)絡(luò)技術(shù)相結(jié)合,實(shí)現(xiàn)資源的共享、業(yè)務(wù)的協(xié)同,將網(wǎng)絡(luò)與云端服務(wù)深度融合,提供更靈活、高效、安全的...詳情>>

2023-10-14 22:31:47