一文搞懂Node的的事件循环

本篇文章聊聊nodejs中的事件循环,希望带大家搞懂nodejs中的事件循环,从此再也不怕面试官的灵魂发问:谈一下nodejs的事件循环!

一文搞懂Node的的事件循环

想必大家面试的时候,都会被面试官问道:“谈谈Nodejs的事件循环吧”。

一文搞懂Node的的事件循环

因为本人也被问道过,但每一次都很尴尬。

关于这个问题各种技术博客上有很多介绍,可我我一直都没有搞明白。因为这些文章往往上来就是一大堆图示、术语,瞬间浇灭了认知的勇气。【相关教程推荐:nodejs视频教程、编程教学】

一文搞懂Node的的事件循环

但是不能不懂啊,面试官还要问,于是流着泪、咬着牙,参考了一些教程,有了自己的总结,马上分享给大家。

一、什么是事件循环?

一句话:事件循环是Nodejs处理异步操作的机制。

Js是单线程的,为什么Nodejs就能处理异步操作?

因为Nodejs把多线程的操作交给了系统内核。

上图:

一文搞懂Node的的事件循环

一文搞懂Node的的事件循环

Nodejs就像一个聪明的小孩,基于Js的它本身无法实现多线程操作,但是它把多线程的操作丢给了系统内核。

一文搞懂Node的的事件循环

因为系统内核大部分都是多线程的,内核执行起来那不是so easy,那Nodejs就高枕无忧了嘛?

二、为什么需要事件循环?

(先解释一下事件循环这个名称,Nodejs是事件驱动的,当什么时候 做什么事情,做的事情就定义在回调函数中;

因此可以将回调函数定义为事件处理函数;所以管理回调函数的机制叫做事件循环;)

既然内核那么强大,Nodejs无事一身轻?

非也,内核执行完毕之后,Nodejs总得执行对应的回调函数吧。

所以就需要一个机制帮助它管理、维护这些异步操作回调函数,防止它们打架啊、乱串啊。

从而以一种高效的方式执行。所以这就是为什么需要—事件循环—。

一文搞懂Node的的事件循环

总结:事件循环是Nodejs用来控制异步代码回调执行顺序的!

三、怎样理解事件循环?

? 口诀一:同步任务总是比异步任务执行更早;

异步API分类

同步任务无需多言,这里先将Nodejs中的异步API进行分类:

一文搞懂Node的的事件循环

简单理解,针对上述三种异步API,事件循环内部提供了3种队列,

一文搞懂Node的的事件循环

奇怪?为什么没有process.nectTick?

华文笔杆 华文笔杆

写材料用华文,华文笔杆帮你搞定公文写作

华文笔杆 491 查看详情 华文笔杆

哈哈,那是因为process.nectTick本身就很奇怪!

process.nectTick

虽然process.nectTick属于异步API,但是却不属于事件循环的一部分。

一文搞懂Node的的事件循环

上图:

一文搞懂Node的的事件循环

这里就牵涉到另一个概念:异步模块!

异步模块

一文搞懂Node的的事件循环

就是这个神奇的家伙,nodejs使用libuv库调用内核,实现多线程的操作!

那这个跟process.nectTick有几毛钱关系?

一文搞懂Node的的事件循环

有,因为process.nectTick可以理解为异步模块的一部分。

一文搞懂Node的的事件循环

因此,process.nectTick总会在事件循环之前被调用!

? 口诀二:process.nectTick是所有异步任务里面最快执行的;

(注:理解Tick

一文搞懂Node的的事件循环

事件循环3种队列运行一周,成为一个Tick!)

好,明白了!

等等……好像还缺少了什么?Promise又是怎么执行的?

Promise

除了nextTick队列,还有一种特殊的队列:微任务队列。微任务队列,主要就是用来处理Promise回调函数的执行。

那微任务队列的执行顺序又是怎样的呢?

上图:

一文搞懂Node的的事件循环

? 口诀三:微任务队列追加在process.nectTick队列后面,事件循环的前面;

上面讲了这么多,整体看下

一文搞懂Node的的事件循环

? 口诀四:实践出真知;

利用上面的理论,聪明的你,能分析一下最终的打印顺序嘛?

console.log('同步代码')setImmediate(() => {    console.log('setImmediate');})setTimeout(() => {    console.log('setTimeout');}, 100)Promise.resolve().then(() => {    console.log('promise');})process.nextTick(() => {    console.log('Tick');})复制代码

那下次我们就结合具体的面试案例,看看它们的打印顺序到底是怎样。

更多node相关知识,请访问:nodejs 教程!

以上就是一文搞懂Node的的事件循环的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/542037.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
《崩坏星穹铁道》云璃光锥最强搭配指南
上一篇 2025年11月9日 15:42:18
如何通过日志优化Linux数据库性能
下一篇 2025年11月9日 15:42:23

相关推荐

  • php数据如何实现文件断点续传_php数据大文件上传解决方案

    断点续传通过文件分片、唯一hash标识、服务端记录上传状态实现,前端切片上传并查询已传分片,PHP后端存储分片并在完成后合并,同时提供状态接口支持续传,需注意hash一致性与临时文件清理。 大文件上传在Web开发中是个常见需求,尤其是涉及视频、备份文件或资源包时。PHP本身对文件上传有一定限制,但通…

    2026年9月24日
    000
  • Laravel 表单多动作处理:区分同一路由下的提交操作

    本教程将详细介绍如何在 laravel 应用中,通过一个 html 表单的多个提交按钮触发不同的后端操作,而无需为每个操作创建单独的表单或路由。核心方法是为提交按钮添加 `name` 和 `value` 属性,然后在控制器中根据这些属性的值来判断执行哪种业务逻辑,从而实现如更新用户角色和删除用户等多…

    2026年9月24日
    000
  • VS Code微服务开发:Docker与Kubernetes集成

    VS Code通过Docker扩展实现本地容器化开发,支持自动生成Dockerfile、一键构建镜像及devcontainer环境一致性;2. Kubernetes扩展可连接集群并管理资源,结合Bridge to Kubernetes实现本地调试与集群网络集成;3. 使用Skaffold自动化构建部…

    2026年9月24日
    100
  • 动态表单输入中多答案数据处理教程

    本教程旨在解决Web开发中,如何高效处理包含动态数量答案的表单提交数据,特别是当需要更新现有问题及其关联答案时。文章将详细阐述前端表单的命名策略以及后端PHP如何解析这些动态输入,以准确获取答案内容及其对应的数据库ID,从而实现数据的精准更新,并提供最佳实践建议。 理解动态答案更新的挑战 在构建问答…

    2026年9月24日
    100
  • PHP Web开发:高效处理动态数量问题答案的表单更新与ID获取

    本教程探讨在PHP Web开发中,如何高效处理具有动态数量答案的问题更新表单。针对需要同时获取答案文本值及其对应ID的场景,文章详细介绍了通过合理设计表单字段命名和利用$_POST超全局变量的键值迭代特性,实现对动态生成答案字段的准确解析和数据提取,确保更新操作的完整性。 问题背景与挑战 在开发问答…

    2026年9月24日
    100
  • VSCode主题开发:创建动态色彩主题的进阶技术解析

    动态主题需通过外部插件监听系统事件实现,核心是利用vscode.themeColor API响应主题切换,结合语义化作用域与Semantic Highlighting精准控制配色逻辑,实现智能自适应视觉体验。 想让VSCode主题随环境自动切换色彩?动态主题不只是换个配色那么简单。核心在于理解VSC…

    2026年9月23日
    400
  • 如何在mysql中使用连接池提升并发

    连接池通过复用数据库连接减少开销,提升高并发下系统性能;需根据语言选择HikariCP、SQLAlchemy等组件,合理配置最大连接数、空闲连接等参数,并结合数据库优化与监控调优以充分发挥效果。 在高并发场景下,频繁创建和销毁数据库连接会带来显著的性能开销。MySQL本身不直接提供连接池功能,但可以…

    2026年9月23日
    300
  • 在PHP中将JSON数组值声明为变量

    本文介绍了如何在PHP中从数据库获取数据并将其编码为JSON数组,然后通过AJAX调用将其传递到另一个页面。重点讲解了如何在接收数据的页面中解析JSON数据,并将JSON数组中的特定值提取为PHP变量,以便在后续的函数或查询中使用。 从数据库获取数据并编码为JSON 首先,我们需要从数据库中获取数据…

    2026年9月23日
    1200
  • 嵌入式Linux开发-根文件系统本地挂载

    嵌入式Linux开发-根文件系统本地挂载嵌入式Linux开发-根文件系统本地挂载嵌入式Linux开发-根文件系统本地挂载嵌入式Linux开发-根文件系统本地挂载

    引言 前一篇文章介绍了根文件系统的制作与nfs网络挂载,本文将探讨如何通过本地挂载根文件系统来完成系统启动。本地挂载通常用于产品发布阶段,并且分为两种操作方式。 第一种方式:在PC机上制作好文件映像rootfs.img,然后通过uboot加载并直接烧写到EMMC中。这种方法最便捷,适用于产品批量生产…

    2026年9月23日 • 用户投稿
    300
  • Vue.js 项目中实现练习进度保存的策略与实践

    本文将探讨在vue.js项目中实现用户练习进度保存的最佳实践。针对需要跨会话保留用户进度的场景,我们将重点介绍如何利用浏览器localstorage进行数据持久化,包括数据的序列化与反序列化、在关键生命周期钩子中加载与保存数据,以及相关的注意事项,确保用户能够从上次中断的地方继续练习。 在开发基于V…

    2026年9月23日
    100
  • 如何使用Java制作简易的博客系统

    首先搭建Spring Boot后端,设计BlogPost实体类并用JPA实现数据持久化,通过BlogController处理页面请求,使用Thymeleaf模板引擎渲染index和create页面,配置H2内存数据库并启用控制台,最终实现文章的发布与展示功能。 用Java制作一个简易的博客系统,核心…

    2026年9月23日
    200
  • PHP如何实现视频留言评论_PHP实现视频留言评论功能

    答案:通过数据库设计、前端表单、后端处理和评论展示四步实现PHP视频留言功能。1. 创建comments表存储信息;2. 构建表单提交昵称与评论;3. 用add_comment.php接收并存入数据库;4. 在页面读取并安全输出评论,防止XSS。 要实现视频留言评论功能,PHP可以结合前端页面、数据…

    2026年9月22日
    200
  • Karate框架中处理带方括号和日期范围的GET请求参数

    本文旨在解决Karate框架中构建包含复杂、带方括号(如filters[start_date])及日期范围的GET请求参数时遇到的URL编码问题。通过对比直接定义查询对象和使用param关键字的方法,详细阐述了如何正确地构造URL,确保参数格式符合预期,从而有效进行API测试。 1. 问题背景与挑战…

    2026年9月22日
    200
  • Karate教程:优雅处理GET请求中的复杂查询参数(含日期范围)

    本教程将详细介绍在Karate框架中如何正确发送包含复杂查询参数(特别是带有方括号的参数名,如filters[start_date])的GET请求。我们将通过实际示例,演示如何利用Karate的* param关键字优雅地构建URL,确保参数被正确编码并传递给后端服务,尤其适用于日期范围等场景。 理解…

    2026年9月22日
    300
  • PHP实时输出如何与消息队列集成_PHP实时输出与消息队列结合

    答案:PHP通过消息队列解耦耗时任务与用户响应,利用flush()实现实时输出感知,结合RabbitMQ、Redis等队列将任务异步处理,前端通过轮询或SSE获取进度,提升系统性能与用户体验。 PHP 实时输出与消息队列的结合,关键在于解耦耗时任务和即时响应用户。虽然 PHP 本身是同步阻塞的,但通…

    2026年9月22日
    100
  • PHP中操作JSON数组对象:添加与修改属性的实践指南

    本教程详细阐述如何在php中高效地处理包含对象的json数组。我们将学习如何利用`json_decode()`将json字符串转换为php数据结构,进而为数组中的现有对象添加或修改属性,并通过`json_encode()`将其转换回json字符串,避免手动构建json的常见错误。 在现代Web开发中…

    2026年9月22日
    1300
  • 理解Next.js与Firestore数据获取中的多次读取现象及优化

    Next.js应用在获取单个Firestore文档时,可能遭遇实际读取次数远超预期的现象,且数据获取函数被多次调用。本文将深入探讨Firestore的计费机制、Next.js数据获取的生命周期特点,并提供使用React cache进行请求去重及其他优化策略,以有效管理Firestore读取成本和提升…

    2026年9月22日
    100
  • 设置php连接mssql的编码格式_通过php连接mssql支持UTF-8编码

    正确配置PHP连接MSSQL并支持UTF-8需:1. 使用sqlsrv扩展并启用extension=php_sqlsrv_80.dll;2. 连接时设置”CharacterSet”=>”UTF-8″;3. 数据库字段使用nvarchar等Unic…

    2026年9月22日
    200
  • Flyway多数据库与CI/CD测试集成策略

    本文深入探讨了在CI/CD流程中,如何高效地配置Flyway以管理多数据库环境下的迁移,尤其关注集成测试场景。我们将比较使用真实数据库服务、Testcontainers以及Flyway自身多数据库配置的优劣,并提供关于分离生产与测试环境迁移脚本的实用策略,旨在确保开发、测试与生产环境的数据一致性与流…

    2026年9月22日
    300
  • 构建VSCode多媒体编程界面与实时音视频处理

    答案:VSCode通过配置Node.js、Python扩展及FFmpeg等工具,结合OpenCV、PyAudio等框架,可构建高效音视频处理环境。1. 安装Python和Node.js支持,启用Pylance、Jupyter插件提升数据处理体验;2. 配置终端与Code Runner实现脚本一键执行…

    2026年9月22日
    100

发表回复

登录后才能评论
关注微信