JS事件循环、宏任务与微任务

在JavaScript中,事件循环(Event Loop)是处理异步操作的核心机制。它负责执行代码,处理事件,并在适当的时候调度回调。为了更好地理解JavaScript的执行模型,我们需要深入探讨事件循环、宏任务(MacroTask)和微任务(MicroTask)之间的关系和运作方式。

一、事件循环

事件循环是JavaScript的运行时环境(如浏览器和Node.js)提供的一种机制,用于处理异步操作。它将JavaScript代码分为同步任务和异步任务,并确保在适当的时机执行这些任务。

二、宏任务与微任务

在事件循环中,异步任务被分为两类:宏任务(MacroTask)和微任务(MicroTask)。

1. 宏任务(MacroTask)

宏任务包括整体代码script、setTimeout、setInterval、setImmediate(Node.js环境)、I/O、UI渲染等。每个宏任务都会触发一个新的事件循环。

2. 微任务(MicroTask)

微任务包括Promise的then和catch方法、process.nextTick(Node.js环境)和MutationObserver(浏览器环境)等。微任务在执行完一个宏任务后,会立即在当前事件循环中执行。

三、事件循环的执行流程

事件循环的执行流程可以概括为以下几个步骤:

  1. 执行栈为空时:如果执行栈为空,事件循环会检查微任务队列是否有任务。如果有,则依次执行微任务,直到微任务队列为空。

  2. 执行微任务:执行完微任务后,事件循环会取出宏任务队列中的一个宏任务来执行。

  3. 执行宏任务:执行宏任务的过程中,如果遇到异步任务(如setTimeout、Promise等),这些任务会被放入对应的队列中等待执行。

  4. 循环执行:执行完一个宏任务后,事件循环会回到第1步,继续检查微任务队列并执行微任务。这个过程会不断重复,形成一个循环。

下面是一个简化的JavaScript事件循环的代码示例,该示例展示了事件循环如何处理宏任务(如setTimeout)和微任务(如Promise

// 宏任务队列
const macroTaskQueue = [];
// 微任务队列
const microTaskQueue = [];// 当前正在执行的宏任务
let currentMacroTask = null;// 模拟事件循环
function eventLoop() {// 执行当前宏任务if (currentMacroTask) {currentMacroTask();currentMacroTask = null;}// 执行所有微任务while (microTaskQueue.length > 0) {const microTask = microTaskQueue.shift();microTask();}// 检查是否有新的宏任务加入队列if (macroTaskQueue.length > 0) {// 获取下一个宏任务currentMacroTask = macroTaskQueue.shift();// 开始新的事件循环迭代eventLoop();} else {// 如果没有宏任务,则事件循环结束console.log('事件循环结束');}
}// 添加宏任务到队列
function scheduleMacroTask(task) {macroTaskQueue.push(task);// 如果当前没有宏任务在执行,则开始事件循环if (!currentMacroTask) {eventLoop();}
}// 添加微任务到队列
function scheduleMicroTask(task) {microTaskQueue.push(task);
}// 示例:使用setTimeout添加宏任务
scheduleMacroTask(() => {console.log('宏任务1');// 添加另一个宏任务scheduleMacroTask(() => {console.log('宏任务2');});// 添加微任务Promise.resolve().then(() => {console.log('微任务1');});
});// 示例:使用Promise添加微任务
Promise.resolve().then(() => {console.log('微任务2');
});// 开始事件循环
eventLoop();

四、宏任务与微任务的区别

宏任务和微任务的主要区别在于它们的执行时机和优先级。宏任务在每个事件循环开始时被执行,而微任务则在执行完一个宏任务后立即执行。因此,微任务的优先级高于宏任务。

这种设计使得微任务可以在不阻塞其他宏任务的情况下快速执行,从而提高了程序的响应速度和性能。

五、Promise与事件循环

Promise是JavaScript中用于处理异步操作的一种对象。它的then和catch方法返回的是一个新的Promise对象,这个对象会被放入微任务队列中等待执行。这意味着,当我们使用Promise进行异步操作时,相关的回调函数会在当前事件循环的微任务阶段被执行。

六、总结

在实际开发中,合理利用Promise等微任务机制,可以提高程序的性能和响应速度。同时,了解事件循环的工作原理也有助于我们避免一些常见的异步编程陷阱和错误。随着JavaScript的不断发展,事件循环和异步编程模型也在不断完善。同时,Web Workers、Service Workers等技术的普及,我们也可以在多线程环境中利用事件循环和异步编程模型来提高程序的并发性能和用户体验。

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

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

相关文章

从文本框限制字符输入,理解代码抽象过程(四次抽象到简单工厂到反射)

这里写目录标题 背景原因抽象过程第一次抽象第二次抽象第三次抽象第四次抽象简单工厂反射 背景 学生信息管理系统中有很多文本框的校验,其中有一点,就是不允许输入过长的信息。 原因 1、文本框校验限制输入长度确保用户内容不超出系统或数据库容量限制…

基于SpringBoot+Vue高校宣讲会管理系统设计与实现

项目介绍: 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装高校宣讲会管理系统软件来发挥其高效地信息…

2024五一劳动节活动策划方案

2024五一劳动节朋克国风养生局(回春集主题)活动策划方案-48P 方案页码:48页 文件格式:pptx 方案简介: 大健康线下活动屡屡出圈 近年来,随着健康意识和生活水平的提升 人们对于自身健康越发关注&#…

面试题:分布式消息中间件 MQ

MQ官网文档: RabbitMQ:https://www.rabbitmq.com/docs RocketMQ:https://rocketmq.apache.org/zh/docs/ Kafka:https://kafka.apache.org/documentation/ DDMQ:https://base.xiaojukeji.com/docs/ddmq 面试题&#xff…

【4103】基于小程序实现的老年人健康管理平台

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:spring…

CIA组织MikroTik软路由攻击场景复现及后门加解密剖析

概述 写文章还是有一段时间了,发布的文章也是获得了不少小伙伴的关注,同时也和圈子里面的小伙伴慢慢的建立起了联系,平时也会时不时的一起探讨一些技术问题。因此,在最近和小伙伴的交流学习过程中,有一个小伙伴提到了…

Java:SpringBoot如何优化启动速度

一、yml中设置懒加载 spring:main:lazy-initialization: true 二、SpringBoot启动类中添加注解 Indexed (Spring5才有该注解) Indexed EnableAsync RestController SpringBootApplication(exclude {WxMaAutoConfiguration.class}) EnableTransactionM…

面试:MYSQL(SQL优化、MYSQL事务)

目录 一、SQL优化 1、如何定位慢查询 (1)方案一:开源工具 (2)方案二:慢日志查询 2、定位到慢查询时,如何优化 3、什么是索引 (1)底层结构 4、聚簇索引&#xff0…

优秀博士学位论文分享:动态三维场景理解与重建

优秀博士学位论文代表了各学科领域博士研究生研究成果的最高水平,本公众号近期将推出“优秀博士学位论文分享”系列文章,对人工智能领域2023年优秀博士学位论文进行介绍和分享,方便广大读者了解人工智能领域最前沿的研究进展。 “博士学位论…

【数据结构初阶】时间复杂度和空间复杂度详解

今天我们来详细讲讲时间复杂度和空间复杂度,途中如果有不懂的地方可翻阅我之前文章。 个人主页:小八哥向前冲~-CSDN博客 数据结构专栏:数据结构【c语言版】_小八哥向前冲~的博客-CSDN博客 c语言专栏:c语言_小八哥向前冲~的博客-CS…

matlab新手快速上手6(引力搜索算法)

本文根据一个较为简单的matlab引力搜索算法框架详细分析蚁群算法的实现过程,对matlab新手友好,源码在文末给出。 引力搜索算法简介: 引力搜索算法是一种启发式优化算法,最初于2009年由伊朗的Esmat Rashedi、Hossein Nezamabadi-p…

uniapp 对接facebook第三方登录

1.登录facebook开发者中心,打开我的应用页面在这里插入图片描述 2.创建应用 3.选择类型 4.填写信息 5.添加登录 6.添加平台 安卓密钥生成【需要 Java 环境!!! 和 openssl库】 Google Code Archive 的 Windows 版 openssl-for-windows OpenSSL 库 将openssl下载到…

如何利用FMEA进行不良事件分析——FMEA软件

免费试用FMEA软件-免费版-SunFMEA FMEA(Failure Modes and Effects Analysis)是一种预防性的质量工具,它帮助识别产品或过程中可能的故障模式,评估其对系统的影响,并优先处理那些对系统性能影响最大的故障模式。在医疗…

新时代教师口才演讲稿(3篇)

新时代教师口才演讲稿(3篇) 新时代教师口才演讲稿(一) 尊敬的各位领导、亲爱的同事们: 大家好! 今天,我站在这里,深感荣幸与激动。在这个新时代里,教师的口才不仅仅是传…

webpack3升级webpack4遇到的各种问题汇总

webpack3升级webpack4遇到的各种问题汇总 问题1 var outputNamecompilation.mainTemplate.applyPluginWaterfull(asset-path,outputOptions.filename,{......)TypeError: compilation.mainTemplate.applyPluginsWaterfall is not a function解决方法 html-webpack-plugin 版…

上市公司-双重差分模型手动匹配绿色企业数据及参考资料

01、数据简介 双重差分模型(DID,Differences-in-Differences)是一种用于估计某个政策或处理效果的经济计量学模型。通过双重差分模型,可以控制一些不易观察的个体特征和时间趋势,以更准确地估计政策的效应。将绿色企业…

文件上传漏洞(upload-labs)

目录 一、文件上传漏洞 1.什么是文件上传漏洞 常见的WebShell 2.文件上传产生漏洞的原因 二、文件上传绕过 (一)客服端绕过-JS验证 1.前端验证 upload-labs第一关 (二)绕过黑名单验证 黑名单验证 1.特殊解析后缀 upl…

快速掌握Yarn:软件包管理工具的安装与使用指南【写作AI免费】

首先,这篇文章是基于笔尖AI写作进行文章创作的,喜欢的宝子,也可以去体验下,解放双手,上班直接摸鱼~ 按照惯例,先介绍下这款笔尖AI写作,宝子也可以直接下滑跳过看正文~ 笔尖Ai写作:…

Linux第十五章

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…

MySQL随便聊----之MySQL的调控按钮-启动选项和系统变量

-------MySQL是怎么运行的 基本介绍 如果你用过手机,你的手机上一定有一个设置的功能,你可以选择设置手机的来电铃声、设置音量大小、设置解锁密码等等。假如没有这些设置功能,我们的生活将置于尴尬的境地,比如在图书馆里无法把手…