js和node事件循环区别

javaScript事件循环机制

一、是什么?

JavaScript是一门单线程语言,同一时间只能做一件事,但并不意味着单线程就是阻塞,而实现单线程非阻塞的方式就是事件循环。

JavaScript中,所有的任务都可以分为:

  • 同步任务:立即执行的任务,同步任务一般会直接进入到主线程中执行
  • 异步任务:异步执行的任务,例如ajax请求,或者setTimeout函数

从上面可以看出,同步任务进入主线程,异步任务进入任务队列,主线程内的任务执行完毕为空,会去读取任务队列对应的任务,推入主线程执行。上述过程不断重复就是事件循环机制。

二、宏任务与微任务

异步任务又分为宏任务与微任务

微任务

  • script (可以理解为外层同步代码)
  • setTimeout/setInterval
  • setImmediate、I/O(Node.js)

微任务

  • Promise.then
  • process.nextTick(NodeJS)

执行宏任务时,遇到微任务就放入微任务任务队列中,当宏任务执行完成后,会查看微任务的事件队列,然后将微任务依次执行完,再进行循环执行下一个宏任务。

node:

  • Timers:用于存储定时器额回调函数(setInterval,setTimeout)
  • Pending callbacks:执行与操作系统相关的回调函数,比如启动服务器端应用时监听端口操作的回调函数就在这里调用。
  • 闲置阶段(idle, prepare):仅系统内部使用
  • 轮询阶段(poll):检索新的 I/O 事件;执行与 I/O 相关的回调(几乎所有情况下,除了关闭的回调函数,那些由计时器和 setImmediate() 调度的之外),其余情况 node 将在适当的时候在此阻塞
  • 检查阶段(check):setImmediate() 回调函数在这里执行
  • 关闭事件回调阶段(close callback):一些关闭的回调函数,例如关闭数据库连接的回调

区别:

Node.js 中的事件循环和浏览器中的事件循环有一些关键的区别,尽管它们都是用于处理异步操作的机制。以下是它们之间的一些主要区别:

1.基于环境:


Node.js:事件循环是 Node.js 运行时的一部分,它负责管理异步操作,例如文件 I/O、网络请求等。
浏览器:事件循环是浏览器引擎的一部分,用于处理诸如 DOM 事件、Ajax 请求等浏览器特定的异步操作。


2.事件循环实现:


Node.js:Node.js 使用 libuv 库来实现事件循环。libuv 是一个跨平台的异步 I/O 库,它提供了事件循环以及线程池等功能,用于管理异步操作。
浏览器:浏览器中的事件循环由浏览器引擎实现,通常是由 Blink(Chrome 和 Opera 使用的引擎)、Gecko(Firefox 使用的引擎)或 WebKit(Safari 使用的引擎)等实现。


3.事件队列:


Node.js:Node.js 有多个事件队列,其中包括 timers 队列(setTimeout 和 setInterval 回调)、I/O 队列(处理文件 I/O、网络 I/O 等)、微任务队列(process.nextTick 和 Promise)以及 setImmediate 队列(在每个事件循环迭代结束时执行)。
浏览器:浏览器也有多个事件队列,包括宏任务队列(例如 DOM 事件、Ajax 请求等)、微任务队列(Promise 和 MutationObserver 回调)、requestAnimationFrame 队列等。


4.主线程阻塞:


Node.js:Node.js 是单线程的,当执行 CPU 密集型操作或阻塞操作时,会导致事件循环被阻塞,从而影响其他异步操作的执行。
浏览器:浏览器是多线程的,JavaScript 代码运行在主线程上,但浏览器还有其他线程,如渲染线程、网络线程等。主线程阻塞可能会导致页面渲染被延迟。

====================

为什么 async/await 是微任务

async/await 在 JavaScript 中是用于处理异步操作的语法糖,它基于 Promise 实现,并且在语义上更加清晰和简洁。当使用 async/await 时,await 关键字会等待一个 Promise 解决(fulfilled)或拒绝(rejected),然后继续执行下一条语句。因此,await 关键字后面的代码会被封装成一个微任务,以便在当前执行栈清空之后立即执行。
下面是为什么 async/await 是微任务的一些原因:

1.与 Promise 密切相关:async/await 是基于 Promise 实现的,await 关键字等待的是一个 Promise 对象的状态。由于 Promise 的 then 方法注册的回调函数属于微任务,因此 await 后面的代码也会作为微任务来执行。
2.顺序执行:async/await 语法让异步代码看起来像同步代码一样顺序执行,因此,await 后面的代码应该在当前任务执行结束后立即执行,以保持程序的顺序执行语义。
3.处理异步结果:await 后面的代码通常是在等待异步操作的结果,并且需要在 Promise 解决后立即执行,以便处理异步操作的结果。
4.避免阻塞:与传统的 Promise 链相比,async/await 更容易编写和理解,并且可以避免回调地狱的问题。将 await 后面的代码作为微任务执行可以确保不会阻塞主线程,从而保持应用的响应性。

总之,async/await 是基于 Promise 的一种语法糖,它将异步代码变得更加清晰和易于理解。将 await 后面的代码作为微任务执行是为了保持顺序执行语义,并确保异步操作的结果能够及时地被处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/670959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

93.网游逆向分析与插件开发-游戏窗口化助手-升级经验数据获取的逆向分析

内容参考于:易道云信息技术研究院VIP课 上一个内容:显示游戏数据到小助手UI 码云地址(游戏窗口化助手 分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:852c339f5e4c103390b123e0eaed…

浅析现代计算机启动流程

文章目录 前言启动流程概述磁盘分区格式MBR磁盘GPT磁盘隐藏分区 传统BIOS引导传统BIOS启动流程 UEFI引导UEFI引导程序UEFI启动流程 引导加载程序启动操作系统相关参考 前言 现代计算机的启动是一个漫长的流程,这个流程中会涉及到各种硬件的配置与交互,包…

Python接口自动化测试框架运行原理及流程

这篇文章主要介绍了Python接口自动化测试框架运行原理及流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本文总结分享介绍接口测试框架开发,环境使用python3selenium3unittestddtrequests测试框…

【GAMES101】Lecture 17 材质

目录 材质 漫反射 镜面反射 折射-Snell’s Law Fresnel Reflection / Term(菲涅耳项) 微表面模型 各向同性与各向异性 BRDF的性质 测量BRDF 材质 渲染方程中的BRDF描述了物体是如何与光线作用的,而物体的材质决定了它看起来是怎么样…

【深度学习理论】持续更新

文章目录 1.统计学习理论 1.统计学习理论 统计学习理论,一款适合零成本搞深度学习的大冤种的方向 从人类学习到机器学习的对比(学习的过程分为归纳和演绎 ),引出泛化和过拟合的概念。 如何表示归纳的函数规律呢?以监督…

CVE-2024-0352:Likeshop任意文件上传漏洞复现 [附POC]

文章目录 Likeshop任意文件上传(CVE-2024-0352)漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现0x06 修复建议Likeshop任意文件上传(CVE-2024-0352)漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关…

什么是可解释AI

可解释性AI(XAI) 可解释性AI(XAI)旨在提高人工智能系统的透明度和可理解性,使人们更好地理解AI的决策过程和原理。随着AI技术的广泛应用,XAI成为了一个备受关注的重要领域。它不仅有助于建立人们对AI的信任…

RTthread线程间通信(邮箱,消息队列,信号/软件中断)---01实际使用API函数

layout: post title: “RT-Thread线程间通信” date: 2024-2-5 15:39:08 0800 tags: RT-Thread 线程间通信 这一篇是实际使用, 代码分析看后面的文章 一般可以使用全局变量以及线程间同步进行实现 RT-Thread也提供了一部分的通信机制 邮箱 一个线程发送, 另外的线程接受信息…

C++从零开始的打怪升级之路(day32)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料 那么开启正题 今天分享的是关于list的模拟实现,今天只实现一部分基…

高清符合要求的SCI图片使用RStudio导出

4.图片格式区别和常识 在计算机中,JPEG(发音为jay-peg, IPA:[ˈdʒeɪpɛg])是一种针对照片视频而广泛使用的有损压缩标准方法。这个名称代表Joint Photographic Experts Group(联合图像专家小组)。此团队创…

微信小程序学习指南:从基础知识到代码展示

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

Qt 常见容器类用法(一)

目录 QMap类 QHash类 QVector类 QMap类 QMap<key,T>提供一个从类型为Key的键到类型为T的值的映射。通常&#xff0c;QMap存储的数据形式是一个键对应一个值&#xff0c;并且按照键Key的次序存储数据。为了能够支持一键多值的情况&#xff0c;QMap提供QMap<key,T&g…

0206作业

TCP&#xff08;传输控制协议&#xff09;和 UDP&#xff08;用户数据报协议&#xff09;是两种常用的网络传输协议。它们之间的主要区别在于&#xff1a; 可靠性&#xff1a;TCP 是一种可靠的传输协议&#xff0c;它提供了数据传输的确认、重传和排序功能。如果数据在传输过程…

假期day4,链表增加与删除(2024/2/5)

单链表头插增加 Linklist insert_head(datatype element,Linklist head) {//创建新节点 Linklist screate_node();if(NULLs)return head; s->dataelement;//1,判断链表为空if(NULLhead){heads;}else //链表不为空{s->nexthead;heads;}return head; }单链表头删除 Linkl…

Bug地狱 #1 突然宕机,企业级应用到底怎么了

Bug地狱 #1 突然宕机&#xff0c;企业级应用到底怎么了 背景 目前就职的企业经营是一家服务小微门店Saas企业&#xff0c;以进销存管理和客户营销为主体提供订阅服务。项目正式上线可以说是从13年&#xff0c;基础架构是Web和后端使用C# .net&#xff0c;数据库使用SQL Serve…

分享76个节日PPT,总有一款适合您

分享76个节日PPT&#xff0c;总有一款适合您 76个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1-j7toLaBUBAJbkd85xe4VQ?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

C#验证字符串是否大写、小写,正则表达式vs用Char.IsUpper和Char.IsLower方法遍历字符数组

目录 一、使用的方法 1.正则表达式 2.用Char.IsUpper或Char.IsLower方法 二、源代码 1.源码 2.生成效果 一、使用的方法 1.正则表达式 正则表达式“^[A-Z]$”&#xff0c;其中[A-Z]表示匹配一个到多个大写字母。 正则表达式“^[a-z]$”&#xff0c;其中[a-z]表示匹配一个…

谈一谈深度学习与机器学习

深度学习是机器学习的一个子领域&#xff0c;其核心是使用多层神经网络来学习数据的复杂表示。机器学习是一种更广泛的概念&#xff0c;涵盖了许多不同的方法和技术&#xff0c;包括深度学习在内。 关系&#xff1a; 深度学习是机器学习的一种方法&#xff1a;深度学习利用多…

EasyExcel下载带下拉框和批注模板

EasyExcel下载带下拉框和批注模板 一、 代码实现 controller下载入口 /***下载excel模板* author youlu* date 2023/8/14 17:31* param response* param request* return void*/PostMapping("/downloadTemplate")public void downloadExcel(HttpServletResponse r…

Mysql-数据库优化-客户端连接参数

客户端参数 原文地址 # 连接池配置 # 初始化连接数 spring.datasource.druid.initial-size1 # 最小空闲连接数&#xff0c;一般设置和initial-size一致 spring.datasource.druid.min-idle1 # 最大活动连接数&#xff0c;一个数据库能够支撑最大的连接数是多少呢&#xff1f; …