我的编程空间,编程开发者的网络收藏夹
学习永远不晚

带你了解NodeJS事件循环

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

带你了解NodeJS事件循环

浏览器中存在两个任务队列,一个是宏任务一个是微任务。但是在NodeJS中一共存在六个事件队列,timerspending callbacks,idle preparepoll,checkclose callbacks。每一个队列里面存放的都是回调函数callback

这六个队列是按顺序执行的。每个队列负责存储不同的任务。

  • timer里面存在的是setTimeout与setInterval的回调函数
  • pending callback是执行操作系统的回调,例如tcp,udp。
  • idle prepare只在系统内部进行使用。一般开发者用不到
  • poll执行与IO相关的回调操作
  • check中存放setImmediate中的回调。
  • close callbacks执行close事件的回调。

在Node中代码从上到下同步执行,在执行过程中会将不同的任务添加到相应的队列中,比如说setTimeout就会放在timers中, 如果遇到文件读写就放在poll里面,等到整个同步代码执行完毕之后就会去执行满足条件的微任务。可以假想有一个队列用于存放微任务,这个队列和前面的六种没有任何关系。

当同步代码执行完成之后会去执行满足条件的微任务,一旦所有的微任务执行完毕就会按照上面列出的顺序去执行队列当中满足条件的宏任务。

首先会执行timers当中满足条件的宏任务,当他将timers中满足的任务执行完成之后就会去执行队列的切换,在切换之前会先去清空微任务列表中的微任务。

所以微任务执行是有两个时机的,第一个时机是所有的同步代码执行完毕,第二个时机队列切换前。

注意在微任务中nextTick的执行优先级要高于Promise,这个只能死记了。

setTimeout(() => {
    console.log('s1');
})

Promise.resolve().then(() => {
    console.log('p1');
})

console.log('start');

process.nextTick(() => {
    console.log('tick');
})

setImmediate(() => {
    console.log('st');
})

console.log('end');

// start end tick p1 s1 st
setTimeout(() => {
    console.log('s1');
    Promise.resolve().then(() => {
        console.log('p1');
    })
    process.nextTick(() => {
        console.log('t1');
    })
})

Promise.resolve().then(() => {
    console.log('p2')
})

console.log('start');

setTimeout(() => {
    console.log('s2');
    Promise.resolve().then(() => {
        console.log('p3');
    })
    process.nextTick(() => {
        console.log('t2');
    })
})

console.log('end');

// start end p2 s1 s2 t1 t2 p1 p3

Node与浏览器事件环执行是有一些不同的。

首先任务队列数不同,浏览器一般只有宏任务和微任务两个队列,而Node中除了微任务队列外还有6个事件队列。

其次微任务执行时机不同,不过他们也有相同的地方就是在同步任务执行完毕之后都会去看一下微任务是否存在可执行的。对浏览器来说每当一个宏任务执行完成之后就会清空一次微任务队列。在Node中只有在事件队列切换时才会去清空微任务队列。

最后在Node平台下微任务执行是有优先级的,nextTick优先于Promise.then, 而浏览器中则是先进先出。

setTimeout(() => {
    console.log('timeout');
})

setImmediate(() => {
    console.log('immdieate');
})

在Node中时而会先输出timeout时而会先输出immdieate,这是因为setTimeout是需要接收一个时间参数的,如果没写就是一个0,我们都知道无论是在Node还是在浏览器,程序是不可能真的是0,他会受很多的因素影响。这取决于运行的环境。

如果setTimeout先执行就会放在timers队列中,这样timeout就会先输入,如果setTimeout因为某些原因后执行了,那么check队列中的immdieate就会先执行。这就是为什么时而输出timeout时而输出immdieate

const fs = require('fs');

fs.readFile('./a.txt', () => {
    setTimeout(() => {
        console.log('timeout');
    }, 0)

    setImmediate(() => {
        console.log('immdieate');
    })
})

这种情况就会一直先输出immdieate后输出timeout,这是因为,代码执行的时候会在timers里面加入timeout, 在poll中加入fs的回调,在check中加入immdieate。fs的回调执行结束之后实在poll队列,队列切换的时候首先会去看微任务,但是这里没有微任务就会继续向下,下面就是check队列而不是timers队列,所以poll清空之后会切换到check队列,执行immdieate回调。

到此这篇关于带你了解NodeJS事件循环的文章就介绍到这了,更多相关NodeJS事件循环内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

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

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

带你了解NodeJS事件循环

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

nodejs事件循环是什么

这篇文章主要讲解了“nodejs事件循环是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs事件循环是什么”吧!我们都听说过 JavaScript 和 Node.js 是单线程的
2023-07-04

nodeJs事件循环运行代码解析

这篇文章主要为大家介绍了nodeJs事件循环运行代码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-16

NodeJS事件循环实例分析

这篇文章主要介绍“NodeJS事件循环实例分析”,在日常操作中,相信很多人在NodeJS事件循环实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”NodeJS事件循环实例分析”的疑惑有所帮助!接下来,请跟
2023-06-29

详解nodejs异步I/O和事件循环

事件驱动模型现在我们来看看nodejs中的事件驱动和异步I/O是如何实现的. nodejs是单线程(single thread)运行的,通过一个事件循环(event-loop)来循环取出消息队列(event-queue)中的消息进行处理,处
2022-06-04

nodejs中事件和事件循环的示例分析

这篇文章主要介绍nodejs中事件和事件循环的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!nodejs中的事件循环虽然nodejs是单线程的,但是nodejs可以将操作委托给系统内核,系统内核在后台处理这些
2023-06-14

nodeJs事件循环运行代码怎么写

这篇文章主要讲解了“nodeJs事件循环运行代码怎么写”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodeJs事件循环运行代码怎么写”吧!Nodejs运行时JS语言是同步,阻塞,单线程的,
2023-07-06

Node.js 事件循环:深入了解引擎室

Node.js 事件循环是一种强大的机制,它始终监听事件并异步执行回调函数。了解它的工作原理至关重要,因为它决定了 Node.js 应用程序的性能和响应能力。
Node.js 事件循环:深入了解引擎室
2024-03-06

深入了解Node事件循环(EventLoop)机制

主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。下面本篇文章就来带大家掌握Node.js中的eventloop,希望对大家有所帮助!
2023-05-14

详解JavaScript事件循环

JavaScript事件循环是一种机制,用于处理异步事件和回调函数。它是JavaScript运行时环境的一部分,负责管理事件队列和调用栈。文章中有详细的代码示例,需要的朋友可以参考一下
2023-05-16

一文带你搞懂面试率超高的JS事件循环

事件循环是 JavaScript 中一个非常重要的概念,下面就来看看浏览器和 Node.js 中的事件循环的原理,以及两者之间的差异,感兴趣的可以了解一下
2022-11-13

nodejs中事件循环机制的示例分析

这篇文章主要介绍了nodejs中事件循环机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前端开发离不开JavaScript,Javascript是一种web前端语
2023-06-14

nodejs可视化学习:事件循环【动图演示】

本篇文章带大家通过动画来学习Node事件循环,希望对大家有所帮助!
2022-11-25

编程热搜

目录