13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

面试官:说说对Node.js中的事件循环机制理解?

本文转载自微信公众号「JS每日一题」,作者灰灰。转载本文请联系JS每日一题公众号。  

创新互联建站-专业网站定制、快速模板网站建设、高性价比萨嘎网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式萨嘎网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖萨嘎地区。费用合理售后完善,10余年实体公司更值得信赖。

一、是什么

在浏览器事件循环中,我们了解到javascript在浏览器中的事件循环机制,其是根据HTML5定义的规范来实现

而在NodeJS中,事件循环是基于libuv实现,libuv是一个多平台的专注于异步IO的库,如下图最右侧所示:

上图EVENT_QUEUE 给人看起来只有一个队列,但EventLoop存在6个阶段,每个阶段都有对应的一个先进先出的回调队列

二、流程

上节讲到事件循环分成了六个阶段,对应如下:

每个阶段对应一个队列,当事件循环进入某个阶段时, 将会在该阶段内执行回调,直到队列耗尽或者回调的最大数量已执行, 那么将进入下一个处理阶段

除了上述6个阶段,还存在process.nextTick,其不属于事件循环的任何一个阶段,它属于该阶段与下阶段之间的过渡, 即本阶段执行结束, 进入下一个阶段前, 所要执行的回调,类似插队

流程图如下所示:

在Node中,同样存在宏任务和微任务,与浏览器中的事件循环相似

微任务对应有:

宏任务对应有:

其执行顺序为:

三、题目

通过上面的学习,下面开始看看题目

 
 
 
 
  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') 

分析过程:

执行结果如下:

 
 
 
 
  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 

分析下流程:

参考文献

https://segmentfault.com/a/1190000012258592

https://juejin.cn/post/6844904100195205133

https://vue3js.cn/interview/


本文名称:面试官:说说对Node.js中的事件循环机制理解?
网页链接:http://cdbrznjsb.com/article/cdpdisd.html

其他资讯

让你的专属顾问为你服务