国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

面試官:說說對 Node.js 中的事件循環機制理解?

開發 前端
在瀏覽器事件循環中,我們了解到javascript在瀏覽器中的事件循環機制,其是根據HTML5定義的規范來實現

本文轉載自微信公眾號「JS每日一題」,作者灰灰。轉載本文請聯系JS每日一題公眾號。  

一、是什么

在瀏覽器事件循環中,我們了解到javascript在瀏覽器中的事件循環機制,其是根據HTML5定義的規范來實現

而在NodeJS中,事件循環是基于libuv實現,libuv是一個多平臺的專注于異步IO的庫,如下圖最右側所示:

上圖EVENT_QUEUE 給人看起來只有一個隊列,但EventLoop存在6個階段,每個階段都有對應的一個先進先出的回調隊列

二、流程

上節講到事件循環分成了六個階段,對應如下:

  • timers階段:這個階段執行timer(setTimeout、setInterval)的回調
  • 定時器檢測階段(timers):本階段執行 timer 的回調,即 setTimeout、setInterval 里面的回調函數
  • I/O事件回調階段(I/O callbacks):執行延遲到下一個循環迭代的 I/O 回調,即上一輪循環中未被執行的一些I/O回調
  • 閑置階段(idle, prepare):僅系統內部使用
  • 輪詢階段(poll):檢索新的 I/O 事件;執行與 I/O 相關的回調(幾乎所有情況下,除了關閉的回調函數,那些由計時器和 setImmediate() 調度的之外),其余情況 node 將在適當的時候在此阻塞
  • 檢查階段(check):setImmediate() 回調函數在這里執行
  • 關閉事件回調階段(close callback):一些關閉的回調函數,如:socket.on('close', ...)

每個階段對應一個隊列,當事件循環進入某個階段時, 將會在該階段內執行回調,直到隊列耗盡或者回調的最大數量已執行, 那么將進入下一個處理階段

除了上述6個階段,還存在process.nextTick,其不屬于事件循環的任何一個階段,它屬于該階段與下階段之間的過渡, 即本階段執行結束, 進入下一個階段前, 所要執行的回調,類似插隊

流程圖如下所示:

在Node中,同樣存在宏任務和微任務,與瀏覽器中的事件循環相似

微任務對應有:

  • next tick queue:process.nextTick
  • other queue:Promise的then回調、queueMicrotask

宏任務對應有:

  • timer queue:setTimeout、setInterval
  • poll queue:IO事件
  • check queue:setImmediate
  • close queue:close事件

其執行順序為:

  • next tick microtask queue
  • other microtask queue
  • timer queue
  • poll queue
  • check queue
  • close queue

三、題目

通過上面的學習,下面開始看看題目

  1. async function async1() { 
  2.     console.log('async1 start'
  3.     await async2() 
  4.     console.log('async1 end'
  5.  
  6. async function async2() { 
  7.     console.log('async2'
  8.  
  9. console.log('script start'
  10.  
  11. setTimeout(function () { 
  12.     console.log('setTimeout0'
  13. }, 0) 
  14.  
  15. setTimeout(function () { 
  16.     console.log('setTimeout2'
  17. }, 300) 
  18.  
  19. setImmediate(() => console.log('setImmediate')); 
  20.  
  21. process.nextTick(() => console.log('nextTick1')); 
  22.  
  23. async1(); 
  24.  
  25. process.nextTick(() => console.log('nextTick2')); 
  26.  
  27. new Promise(function (resolve) { 
  28.     console.log('promise1'
  29.     resolve(); 
  30.     console.log('promise2'
  31. }).then(function () { 
  32.     console.log('promise3'
  33. }) 
  34.  
  35. console.log('script end'

分析過程:

  • 先找到同步任務,輸出script start
  • 遇到第一個 setTimeout,將里面的回調函數放到 timer 隊列中
  • 遇到第二個 setTimeout,300ms后將里面的回調函數放到 timer 隊列中
  • 遇到第一個setImmediate,將里面的回調函數放到 check 隊列中
  • 遇到第一個 nextTick,將其里面的回調函數放到本輪同步任務執行完畢后執行
  • 執行 async1函數,輸出 async1 start
  • 執行 async2 函數,輸出 async2,async2 后面的輸出 async1 end進入微任務,等待下一輪的事件循環
  • 遇到第二個,將其里面的回調函數放到本輪同步任務執行完畢后執行
  • 遇到 new Promise,執行里面的立即執行函數,輸出 promise1、promise2
  • then里面的回調函數進入微任務隊列
  • 遇到同步任務,輸出 script end
  • 執行下一輪回到函數,先依次輸出 nextTick 的函數,分別是 nextTick1、nextTick2
  • 然后執行微任務隊列,依次輸出 async1 end、promise3
  • 執行timer 隊列,依次輸出 setTimeout0
  • 接著執行 check 隊列,依次輸出 setImmediate
  • 300ms后,timer 隊列存在任務,執行輸出 setTimeout2

執行結果如下:

  1. script start 
  2. async1 start 
  3. async2 
  4. promise1 
  5. promise2 
  6. script end 
  7. nextTick1 
  8. nextTick2 
  9. async1 end 
  10. promise3 
  11. setTimeout0 
  12. setImmediate 
  13. setTimeout2 

最后有一道是關于setTimeout與setImmediate的輸出順序

  1. setTimeout(() => { 
  2.   console.log("setTimeout"); 
  3. }, 0); 
  4.  
  5. setImmediate(() => { 
  6.   console.log("setImmediate"); 
  7. }); 

輸出情況如下:

  1. 情況一: 
  2. setTimeout 
  3. setImmediate 
  4.  
  5. 情況二: 
  6. setImmediate 
  7. setTimeout 

分析下流程:

  • 外層同步代碼一次性全部執行完,遇到異步API就塞到對應的階段
  • 遇到setTimeout,雖然設置的是0毫秒觸發,但實際上會被強制改成1ms,時間到了然后塞入times階段
  • 遇到setImmediate塞入check階段
  • 同步代碼執行完畢,進入Event Loop
  • 先進入times階段,檢查當前時間過去了1毫秒沒有,如果過了1毫秒,滿足setTimeout條件,執行回調,如果沒過1毫秒,跳過
  • 跳過空的階段,進入check階段,執行setImmediate回調
  • 這里的關鍵在于這1ms,如果同步代碼執行時間較長,進入Event Loop的時候1毫秒已經過了,setTimeout先執行,如果1毫秒還沒到,就先執行了setImmediate

參考文獻

https://segmentfault.com/a/1190000012258592

https://juejin.cn/post/6844904100195205133

 

https://vue3js.cn/interview/

 

責任編輯:武曉燕 來源: JS每日一題
相關推薦

2021-06-30 07:19:36

React事件機制

2021-06-08 08:33:23

NodeStream數據

2021-06-07 09:41:48

NodeBuffer 網絡協議

2021-06-03 08:14:01

NodeProcessJavaScript

2024-01-05 08:49:15

Node.js異步編程

2021-06-04 07:55:30

Node Fs 操作

2021-05-31 10:35:34

TCPWebSocket協議

2021-07-12 08:35:24

組件應用場景

2021-06-01 08:25:06

Node.jsJavaScript運行

2021-07-07 08:36:45

React應用場景

2021-05-27 09:00:00

Node.js開發線程

2021-09-13 09:23:52

TypeScript命名空間

2021-06-15 10:01:02

應用系統軟件

2024-08-26 14:52:58

JavaScript循環機制

2021-07-13 07:52:03

ReactHooks組件

2017-08-16 10:36:10

JavaScriptNode.js事件驅動

2021-10-29 09:40:21

設計模式軟件

2021-07-29 07:55:20

React Fiber架構引擎

2021-06-29 09:47:34

ReactSetState機制

2021-06-02 09:42:29

Node. js全局對象
點贊
收藏

51CTO技術棧公眾號

国产精品久久久久一区二区国产| 精品国产3级a| 操人视频欧美| 国产大片一区| 91福利在线播放| 伦理片一区二区三区| 国产精品视频免费| 久久久久久久久久国产| 午夜在线免费观看视频| 91亚洲国产成人精品一区二三| 97人人香蕉| 国产精品对白久久久久粗| 亚洲精品99久久久久中文字幕| 在线观看黄色| 国产精品久久精品日日| 天天想你在线观看完整版电影免费| 午夜久久99| 欧美最猛性xxxxx免费| av最新在线| 欧美日韩综合一区| 波多野结衣中文字幕在线| 久久精品欧美一区二区三区不卡| 一本一本久久a久久精品综合妖精| 午夜精品亚洲| 国产高清视频一区三区| 精品一区二区三区在线观看视频| 亚洲娇小xxxx欧美娇小| 国产精品—色呦呦| 九色精品国产蝌蚪| 久久色精品视频| 老司机2019福利精品视频导航| 欧美另类变人与禽xxxxx| 最新中文字幕在线观看| 一级特黄大欧美久久久| 黄色毛片视频| 亚洲欧美国产高清| 成人福利免费网站| 亚洲卡通欧美制服中文| 丝袜制服影音先锋| 中文字幕一区二区三区av| 久久夜色精品| 国产乱码精品一区二区三区中文 | 麻豆成人久久精品二区三区小说| 亚洲视频在线观看免费| 成人国内精品久久久久一区| 日韩高清在线一区| 精品国产一区二区三区久久久狼| 伊人久久高清| 日韩视频精品在线| 精品国产亚洲一区二区在线观看| 欧美xxxx做受欧美| 激情小说亚洲色图| 国产91免费观看| 91精品亚洲| 国产精品一 二 三| 日韩高清一区二区| 亚洲成人动漫在线| 国产亚洲精品中文字幕| 成年人视频在线网站| 精品欧美aⅴ在线网站 | 欧美日韩在线三区| 在线午夜影院| 一区二区三区 在线观看视| 日韩一区二区三区高清在线观看| 国产91精品视频在线观看| 婷婷综合激情| 亚洲一区二区三区涩| 99国产欧美另类久久久精品| 美女在线一区| 4438x成人网最大色成网站| 91破解版在线观看| 欧美精品一区二区免费| 久久国产成人午夜av影院宅| 欧美下载看逼逼| wwwwxxxxx欧美| 欧美日韩国产综合视频| 亚洲激情国产精品| 成人在线超碰| 精品蜜桃一区二区三区| 99久免费精品视频在线观看| 日本私人影院在线观看| 亚洲精品成人久久久| 色狠狠久久av综合| 欧美视频1区| 国产精品二三区| av网站在线免费| 欧美丰满少妇xxxx| 精品成人国产| 久久久久久久激情| 在线免费一区三区| 在线观看亚洲精品福利片| 91精品国产综合久久香蕉| 九九久久精品视频| 性欧美18+| 亚洲香蕉伊综合在人在线视看| 国产免费播放一区二区| 好色先生视频污| 91成人网在线| 国产精品jk白丝蜜臀av小说| 欧美午夜免费| 亚洲一区二区三区美女| 91福利区在线观看| 国产精品中文字幕在线| 成人黄色大片在线观看| 五月婷婷在线视频| 欧洲成人性视频| 国产在线精品不卡| 久久伊伊香蕉| 欧美极品少妇xxxxⅹ裸体艺术| 久久久久中文| 自拍偷拍电影| 一区二区三区在线播放欧美| 国产精品99一区二区| 网站一区二区三区| 日韩av综合网站| 亚洲黑丝一区二区| 922tv免费观看在线| 久久成人精品视频| 久久超级碰视频| 在线观看完整版免费| 国产成人涩涩涩视频在线观看| 国产成人在线视频网站| 黄色在线论坛| 91在线观看免费| 亚洲欧美日韩小说| 欧美午夜精品一区| 国产原创视频在线观看| 欧美性受xxxx白人性爽| 不卡影院免费观看| free性欧美| 蜜桃臀一区二区三区| 亚洲国产aⅴ天堂久久| 久久久久亚洲精品中文字幕| 国产精品波多野结衣| 欧美日本国产一区| 国产国产精品| 白白色视频在线| 欧美资源在线观看| 国产精品色在线| 永久免费观看精品视频| 毛片在线视频观看| 亚洲欧美三级在线| 狠狠色综合日日| 欧亚av在线| 伊人久久99| 亚洲激情视频网站| 蜜桃精品视频在线观看| 欧美xxxx黑人又粗又长| 欧美日韩国产一二| 精品毛片乱码1区2区3区| 亚洲一区二区三区高清不卡| 风间由美一区| 精品国产免费久久久久久尖叫 | 欧美黄页在线免费观看| 天堂av免费看| 亚洲国产成人精品女人久久久 | 国产盗摄视频一区二区三区| 成人影院在线视频| 亚洲在线观看一区| 亚洲精品国产精品国产自| 久久精品国产色蜜蜜麻豆| 97蜜桃久久| 亚洲小视频在线播放| 一区二区欧美亚洲| 99热精品一区二区| 激情综合五月| www.97.| 欧美在线性视频| 午夜欧美视频在线观看| 久久久五月天| aaa大片在线观看| www成人免费| 海角国产乱辈乱精品视频| 1000精品久久久久久久久| 大色综合视频网站在线播放| 国产综合在线观看| 日本免费高清一区二区| 一区二区在线视频播放| 国产情人综合久久777777| 亚洲精品**不卡在线播he| 国产乱理伦片a级在线观看| 色999日韩自偷自拍美女| 深夜福利一区二区| 中文字幕乱码久久午夜不卡| 一区二区美女| 亚乱亚乱亚洲乱妇| 丰满的少妇愉情hd高清果冻传媒| 久久男人的天堂| 精品动漫一区二区| 噜噜噜在线观看免费视频日韩 | 香蕉久久久久久| 免费福利影院| 精品国产乱码一区二区三区四区 | 99视频精品| 成人综合网站| 91av入口| 久久大片网站| 色偷偷亚洲男人天堂| 亚洲一二三四在线| 蜜桃精品视频在线|