文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-03 03:29

关注

一、是什么

在浏览器事件循环中,我们了解到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/

 

来源:JS每日一题内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯