本文转载自微信公众号「JS每日一题」,作者灰灰。转载本文请联系JS每日一题公众号。
创新互联建站-专业网站定制、快速模板网站建设、高性价比萨嘎网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式萨嘎网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖萨嘎地区。费用合理售后完善,10余年实体公司更值得信赖。
在浏览器事件循环中,我们了解到javascript在浏览器中的事件循环机制,其是根据HTML5定义的规范来实现
而在NodeJS中,事件循环是基于libuv实现,libuv是一个多平台的专注于异步IO的库,如下图最右侧所示:
上图EVENT_QUEUE 给人看起来只有一个队列,但EventLoop存在6个阶段,每个阶段都有对应的一个先进先出的回调队列
上节讲到事件循环分成了六个阶段,对应如下:
每个阶段对应一个队列,当事件循环进入某个阶段时, 将会在该阶段内执行回调,直到队列耗尽或者回调的最大数量已执行, 那么将进入下一个处理阶段
除了上述6个阶段,还存在process.nextTick,其不属于事件循环的任何一个阶段,它属于该阶段与下阶段之间的过渡, 即本阶段执行结束, 进入下一个阶段前, 所要执行的回调,类似插队
流程图如下所示:
在Node中,同样存在宏任务和微任务,与浏览器中的事件循环相似
微任务对应有:
宏任务对应有:
其执行顺序为:
通过上面的学习,下面开始看看题目
- async function async1() {
- console.log('async1 start')
- await async2()
- console.log('async1 end')
- }
- async function async2() {
- console.log('async2')
- }
- console.log('script start')
- setTimeout(function () {
- console.log('setTimeout0')
- }, 0)
- setTimeout(function () {
- console.log('setTimeout2')
- }, 300)
- setImmediate(() => console.log('setImmediate'));
- process.nextTick(() => console.log('nextTick1'));
- async1();
- process.nextTick(() => console.log('nextTick2'));
- new Promise(function (resolve) {
- console.log('promise1')
- resolve();
- console.log('promise2')
- }).then(function () {
- console.log('promise3')
- })
- console.log('script end')
分析过程:
执行结果如下:
- script start
- async1 start
- async2
- promise1
- promise2
- script end
- nextTick1
- nextTick2
- async1 end
- promise3
- setTimeout0
- setImmediate
- setTimeout2
最后有一道是关于setTimeout与setImmediate的输出顺序
- setTimeout(() => {
- console.log("setTimeout");
- }, 0);
- setImmediate(() => {
- console.log("setImmediate");
- });
输出情况如下:
- 情况一:
- setTimeout
- setImmediate
- 情况二:
- setImmediate
- setTimeout
分析下流程:
参考文献
https://segmentfault.com/a/1190000012258592
https://juejin.cn/post/6844904100195205133
https://vue3js.cn/interview/
分享文章:面试官:说说对Node.js中的事件循环机制理解?
当前URL:http://www.shufengxianlan.com/qtweb/news14/214564.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联