iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >带你了解NodeJS事件循环
  • 279
分享到

带你了解NodeJS事件循环

2024-04-02 19:04:59 279人浏览 安东尼
摘要

浏览器中存在两个任务队列,一个是宏任务一个是微任务。但是在nodejs中一共存在六个事件队列,timers,pending callbacks,idle prepare,poll,

浏览器中存在两个任务队列,一个是宏任务一个是微任务。但是在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事件循环内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 带你了解NodeJS事件循环

本文链接: https://www.lsjlt.com/news/139057.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 带你了解NodeJS事件循环
    浏览器中存在两个任务队列,一个是宏任务一个是微任务。但是在NodeJS中一共存在六个事件队列,timers,pending callbacks,idle prepare,poll,...
    99+
    2022-11-13
  • 一篇文章带你了解vue.js的事件循环机制
    目录一、事件循环机制介绍       二、经典事件循环面试题总结一、事件循环机制介绍    ...
    99+
    2022-11-13
  • nodejs事件循环是什么
    这篇文章主要讲解了“nodejs事件循环是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs事件循环是什么”吧!我们都听说过 JavaScript 和 Node.js 是单线程的...
    99+
    2023-07-04
  • 如何理解Nodejs中的事件循环
    这期内容当中小编将会给大家带来有关如何理解Nodejs中的事件循环,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Node事件循环Node底层使用的语言libuv,是一个c...
    99+
    2022-10-19
  • nodeJs事件循环运行代码解析
    目录Nodejs运行时node运行时代码运行Event Loop如何工作?实验Nodejs运行时 JS语言是同步,阻塞,单线程的,但是nodejs不是。Nodejs由三个主要组件:...
    99+
    2023-05-16
    nodeJs事件循环 nodeJs 事件循环
  • 全面了解Node事件循环
    目录Node事件循环事件循环图主线程事件循环 圈timers队列的工作原理poll队列的运作方式举例梳理事件流程check 阶段setImmediate() 与 setTimeout...
    99+
    2022-11-12
  • NodeJS事件循环实例分析
    这篇文章主要介绍“NodeJS事件循环实例分析”,在日常操作中,相信很多人在NodeJS事件循环实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”NodeJS事件循环实例分析”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-29
  • 详解nodejs异步I/O和事件循环
    事件驱动模型 现在我们来看看nodejs中的事件驱动和异步I/O是如何实现的. nodejs是单线程(single thread)运行的,通过一个事件循环(event-loop)来循环取出消息队列(eve...
    99+
    2022-06-04
    详解 事件 nodejs
  • Pythonfor循环你了解吗
    目录一、For 语法结构和基于数字(range)的循环二、基于列表list,元组tuple的循环三、跳过单次循环四、马上退出循环五、嵌套循环六、一次性退出嵌套循环七、 显示...
    99+
    2022-11-12
  • nodejs中事件和事件循环的示例分析
    这篇文章主要介绍nodejs中事件和事件循环的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!nodejs中的事件循环虽然nodejs是单线程的,但是nodejs可以将操作委托给系统内核,系统内核在后台处理这些...
    99+
    2023-06-14
  • nodejs事件循环有哪几个阶段
    本篇内容介绍了“nodejs事件循环有哪几个阶段”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-19
  • Nodejs中如何理解异步I/O和事件循环
    这期内容当中小编将会给大家带来有关Nodejs中如何理解异步I/O和事件循环,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。异步I/O概念处理器访问任何寄存器和 Cache...
    99+
    2022-10-19
  • 深入了解Javascript的事件循环机制
    目录单线程的Javascript同步 vs 异步 宏任务 vs 微任务定时器To Be Continued单线程的Javascript JavaScript是一种单线程语言,它主要用...
    99+
    2022-11-13
  • 深入了解Node事件循环(EventLoop)机制
    主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。下面本篇文章就来带大家掌握Node.js中的eventloop,希望对大家有所帮助!虽然js可以在浏览器...
    99+
    2023-05-14
    javascript Node.js 面试 前端
  • nodeJs事件循环运行代码怎么写
    这篇文章主要讲解了“nodeJs事件循环运行代码怎么写”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodeJs事件循环运行代码怎么写”吧!Nodejs运行时JS语言是同步,阻塞,单线程的,...
    99+
    2023-07-06
  • 一文带你搞懂面试率超高的JS事件循环
    目录1. 异步执行原理(1)单线程的JavaScript(2)多线程的浏览器2. 浏览器事件循环(1)执行栈与任务队列(2)宏任务和微任务3. Node.js的事件循环(1)事件循环...
    99+
    2022-11-13
    JS 事件循环
  • 详解JavaScript事件循环
    目录一、事件循环的执行过程二、事件循环进阶用法三、JavaScript任务类型3.1 同步任务&异步任务3.2 宏任务&微任务JavaScript事件循环是一种机制,...
    99+
    2023-05-16
    JavaScript事件循环 JavaScript循环
  • nodejs中事件循环机制的示例分析
    这篇文章主要介绍了nodejs中事件循环机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前端开发离不开JavaScript,Javascript是一种web前端语...
    99+
    2023-06-14
  • 带你了解MySQL中的事件调度器EVENT
    MySQL中的事件调度器,EVENT,也叫定时任务,类似于Unix crontab或Windows任务调度程序。 EVENT由其名称和所在的schema唯一标识。 EVENT根据计划执行特定操作。操作由SQL语句组成...
    99+
    2022-05-30
    MySQL 事件调度器 MySQL event
  • 一文带你了解WPF中的附加事件
    目录什么是附加事件附加事件用法Microsoft 官方文档附加事件案例定义自定义控件注册使用附加事件什么是附加事件 Microsoft 官方概述: 附加事件可用于在非元素类中定义新的...
    99+
    2022-12-08
    WPF附加事件用法 WPF附加事件 WPF 事件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作