当前位置: 首页 > news >正文

宏任务和微任务的区别

在 JavaScript 的异步编程模型中,宏任务(Macro Task)和微任务(Micro Task)是事件循环(Event Loop)机制中的两个重要概念。它们用于管理异步操作的执行顺序。


1. 宏任务 (Macro Task)

宏任务是较大的任务块,它们在事件循环的每一轮迭代中按顺序执行。常见的宏任务包括:

  • setTimeoutsetInterval
  • setImmediate (Node.js 环境)
  • I/O 操作
  • UI 渲染
宏任务的执行流程
  • 每次事件循环从宏任务队列中取出一个任务执行。
  • 当一个宏任务执行完后,会检查微任务队列是否为空,如果不为空,优先执行所有微任务队列中的任务。
  • 之后,事件循环继续进入下一个宏任务。

2. 微任务 (Micro Task)

微任务是更细粒度的任务,比宏任务优先级更高。微任务会在当前宏任务执行完后立即执行,并在下一个宏任务开始之前完成。

常见的微任务包括:

  • Promise.then/catch/finally
  • MutationObserver
  • queueMicrotask
微任务的执行流程
  • 当前宏任务执行完毕后,立即执行所有的微任务,直到微任务队列为空。
  • 新增的微任务会被加入当前微任务队列,直到所有微任务都完成。

宏任务和微任务的区别

特性宏任务 (Macro Task)微任务 (Micro Task)
优先级优先级低,执行顺序在微任务之后优先级高,当前宏任务执行后立即执行
典型场景setTimeout、setInterval、I/O、UI 渲染等Promise.then、queueMicrotask 等
执行时机每次事件循环的起始阶段当前宏任务完成后,下一个宏任务之前

实际示例

以下代码展示了宏任务和微任务的执行顺序:

console.log('开始'); // 同步任务setTimeout(() => {console.log('宏任务:setTimeout');
}, 0);Promise.resolve().then(() => {console.log('微任务:Promise');
});console.log('结束'); // 同步任务

执行顺序:

  1. 同步任务:输出 '开始'
  2. 同步任务:输出 '结束'
  3. 微任务:输出 '微任务:Promise'
  4. 宏任务:输出 '宏任务:setTimeout'

图解事件循环

  1. 同步任务直接进入主线程执行。
  2. 微任务进入微任务队列。
  3. 宏任务进入宏任务队列。

事件循环的顺序为:

  • 执行主线程的同步代码。
  • 清空微任务队列。
  • 执行一个宏任务(从宏任务队列中取出)。
  • 回到第二步,重复以上流程。

关键点总结

  • 微任务优先级高于宏任务。
  • 微任务适用于需要尽快执行的逻辑(如 Promise 的回调)。
  • 宏任务适用于稍后执行的逻辑(如计时器或 I/O 操作)。

了解这些机制,可以帮助我们更好地调试和优化 JavaScript 代码的异步行为。

相关文章:

宏任务和微任务的区别

在 JavaScript 的异步编程模型中,宏任务(Macro Task)和微任务(Micro Task)是事件循环(Event Loop)机制中的两个重要概念。它们用于管理异步操作的执行顺序。 1. 宏任务 (Macro Task) 宏任务是较…...

数据库系统原理复习汇总

数据库系统原理复习汇总 一、数据库系统原理重点内容提纲 题型:主观题 1、简答题 第一章:数据库的基本概念:数据库、数据库管理系统、三级模式;两级映像、外码 第二章:什么是自然连接、等值连接; 第三…...

Linux day1204

五.安装lrzsz lrzsz 是用于在 Linux 系统中文件上传下载的软件。大家可能会存在疑问,我们用 MobaXterm 图形化界面就可以很方便的完成上传下载,为什么还要使用这个软件来 完成上传下载呢?实际上是这样的, Linux 的远程连接工具…...

如何在 Ubuntu 22.04 上安装并开始使用 RabbitMQ

简介 消息代理是中间应用程序,在不同服务之间提供可靠和稳定的通信方面发挥着关键作用。它们可以将传入的请求存储在队列中,并逐个提供给接收服务。通过以这种方式解耦服务,你可以使其更具可扩展性和性能。 RabbitMQ 是一种流行的开源消息代…...

【OpenGL ES】GLSL基础语法

1 前言 本文将介绍 GLSL 中数据类型、数组、结构体、宏、运算符、向量运算、矩阵运算、函数、流程控制、精度限定符、变量限定符(in、out、inout)、函数参数限定符等内容,另外提供了一个 include 工具,方便多文件管理 glsl 代码&a…...

如何使用交叉编译器调试C语言程序在安卓设备中运行

一、前言 随着移动设备的普及与技术的飞速发展,越来越多的开发者面临着在Android设备上运行和调试C语言等程序的需求。然而,在软件开发的世界里,不同硬件架构对程序运行的要求千差万别,这无疑增加了开发的复杂性。特别是在移动计…...

Java全栈项目 - 智能考勤管理系统

项目介绍 智能考勤管理系统是一个基于 Java 全栈技术开发的现代化企业考勤解决方案。该系统采用前后端分离架构,实现了员工考勤、请假管理、统计分析等核心功能,旨在帮助企业提高人力资源管理效率。 技术栈 后端技术 Spring Boot 2.6.xSpring Securi…...

Linux Shell : Process Substitution

注&#xff1a;本文为 “Process Substitution” 相关文章合辑。 英文引文机翻&#xff0c;未校。 Process Substitution. 进程替换允许使用文件名引用进程的输入或输出。它采取以下形式 <(list)or >(list)进程 list 异步运行&#xff0c;其输入或输出显示为文件名。…...

JOGL 从入门到精通:开启 Java 3D 图形编程之旅

一、引言 Java 作为一门广泛应用的编程语言&#xff0c;在图形编程领域也有着强大的工具和库。JOGL&#xff08;Java OpenGL&#xff09;便是其中之一&#xff0c;它为 Java 开发者提供了访问 OpenGL&#xff08;Open Graphics Library&#xff09;功能的接口&#xff0c;使得…...

汽车网络安全基线安全研究报告

一、引言 随着汽车行业朝着智能网联方向飞速发展&#xff0c;汽车网络安全已成为保障用户安全和行业健康发展的关键要素。本报告将深入探讨汽车网络安全相关内容&#xff0c;以及国际、国内重要的汽车网络安全标准基线和相应防护措施等内容。 二、汽车网络安全的重要性 &…...

Eclipse 修改项目栏字体大小

1、菜单栏选择window->preference&#xff0c;然后选择General->Appearance->Colors and Fonts&#xff0c;在搜索栏输入"tree"&#xff0c;点击"Edit"修改字体。 2、修改字体&#xff0c;选择"四号字体"&#xff0c;点击"确定&qu…...

【PCIe 总线及设备入门学习专栏 5.1 -- PCIe 引脚 PRSNT 与热插拔】

文章目录 OverviewPRSNT 与热插拔PRSNT 硬件设计 Overview Spec 定义的热插拔是把一个PCIe卡&#xff08;设备&#xff09;从一个正在运行的背板或者系统中插入/或者移除。这个过程需要不影响系统的其他功能。插入的新的设备可以正确工作。 显然&#xff0c;这里面需要考虑的问…...

【YOLO】YOLOv5原理

概述 YOLOv5的主要架构 Backbone&#xff08;主干网络&#xff09;&#xff1a;负责提取输入图像的多层次特征 Neck&#xff08;颈部网络&#xff09;&#xff1a;进行特征融合和多尺度特征处理&#xff0c;通常包含FPN&#xff08;特征金字塔网络&#xff09;和PAN&#xff0…...

uniapp中wx.getFuzzyLocation报错如何解决

一、用wx.getLocation接口审核不通过 用uniapp开发小程序时难免需要获取当前地理位置。 代码如下&#xff1a; uni.getLocation({type: wgs84,success: function (res) {console.log(当前位置的经度&#xff1a; res.longitude);console.log(当前位置的纬度&#xff1a; r…...

opencv图像直方图

【欢迎关注编码小哥&#xff0c;学习更多实用的编程方法和技巧】 1、基本直方图计算 // 灰度图直方图 cv::Mat calculateGrayscaleHistogram(const cv::Mat& image) {cv::Mat histogram;int histSize 256; // 灰度级别float range[] {0, 256};const float* histRange …...

OpenCV计算机视觉 03 椒盐噪声的添加与常见的平滑处理方式(均值、方框、高斯、中值)

上一篇文章&#xff1a;OpenCV计算机视觉 02 图片修改 图像运算 边缘填充 阈值处理 目录 添加椒盐噪声 图像平滑常见处理方式 均值滤波 (blur) 方框滤波 (boxFilter) ​高斯滤波 (GaussianBlur) 中值滤波 (medianBlur) 添加椒盐噪声 def add_peppersalt_noise(image, n…...

【嵌入式C语言】内存分布

内存分布 内存分布图内存的属性&#xff1a;只读空间只读空间的特点编程注意事项 栈空间栈的工作原理栈的特点栈溢出与堆的区别 堆空间堆的特点内存分配函数内存泄漏总结 内存分布图 内存的属性&#xff1a; 在C语言中&#xff0c;内存的属性主要取决于它是如何分配的以及它在…...

【brainpan靶场渗透】

文章目录 一、基础信息 二、信息收集 三、反弹shell 四、提权 一、基础信息 Kali IP&#xff1a;192.168.20.146 靶机 IP&#xff1a;192.168.20.155 二、信息收集 似乎开放了9999&#xff0c;10000端口&#xff0c;访问页面没有太多内容&#xff0c;扫描一下目录 dirs…...

Java实现观察者模式

一、前言 观察者模式&#xff0c;又称为发布订阅模式&#xff0c;是一种行为设置模式&#xff0c;允许对象之间建立一对多的依赖关系&#xff0c;这样当一个对象状态改变时&#xff0c;它的所有依赖者&#xff08;观察者&#xff09;都会收到通知并自动更新。 二、具体实现 …...

通过百度api处理交通数据

通过百度api处理交通数据 1、读取excel获取道路数据 //道路名称Data EqualsAndHashCode public class RoadName {ExcelProperty("Name")private String name; }/*** 获取excel中的道路名称*/private static List<String> getRoadName() {// 定义文件路径&…...

上班多年后才知道,原来提完离职后,第二天公司就同意你走,不是人情味,而是铜臭味。

昨天有个前同事找我喝酒&#xff0c;说提了离职&#xff0c;原本做好了交接一个月的心理准备。结果第二天HR就笑眯眯地跑来&#xff0c;说工作已经安排人接手&#xff0c;今天办完手续就可以走人了。这哥们感动坏了&#xff0c;觉得公司通情达理&#xff0c;不耽误他去下家报到…...

从报告看懂安全隐患,提升防护能力

渗透测试报告不仅是“漏洞清单”&#xff0c;更是企业提升安全防护能力的“行动指南”。很多企业拿到报告后&#xff0c;只关注漏洞数量&#xff0c;却不知道如何解读隐患、落地整改&#xff0c;最终导致测试流于形式&#xff0c;安全风险依然存在。下面通俗拆解&#xff0c;教…...

Hypersistence Utils标识符生成器完全教程:BatchSequence、TSID和SequenceOptimizer

Hypersistence Utils标识符生成器完全教程&#xff1a;BatchSequence、TSID和SequenceOptimizer 【免费下载链接】hypersistence-utils The Hypersistence Utils library (previously known as Hibernate Types) gives you Spring and Hibernate utilities that can help you g…...

CSS如何实现动态间距调整_通过CSS变量控制padding与margin值

CSS变量可动态修改padding/margin&#xff0c;需以--开头、设默认值如var(--space-md, 12px)&#xff0c;响应式通过media更新变量值&#xff0c;注意margin塌陷、命名规范及单位一致性。怎么用CSS变量动态改padding和margin直接在根元素或组件上定义--space-sm、--space-md这类…...

PHP异步I/O迁移紧急预案(含同步代码自动转换工具链+CI/CD熔断检测脚本)

第一章&#xff1a;PHP异步I/O迁移紧急预案概览当传统阻塞式 PHP 应用遭遇高并发 I/O 瓶颈&#xff08;如大量 HTTP 请求、数据库查询或文件读写&#xff09;&#xff0c;服务响应延迟激增、连接池耗尽、CPU 利用率反常偏低——此时&#xff0c;异步 I/O 迁移已非优化选项&…...

ERTEC 系列 PROFINET 芯片级硬件过滤器分析恫

一、语言特性&#xff1a;Java 26 与模式匹配进化 1.1 Java 26 语言级别支持 IDEA 2026.1 EAP 最引人注目的变化之一&#xff0c;就是新增 Java 26 语言级别支持。这意味着开发者可以提前体验和测试即将在 JDK 26 中正式发布的语言特性。 其中最重要的变化是对 JEP 530 的全面支…...

EF Core 10向量搜索不是“加个NuGet包”那么简单:一位资深架构师用12小时重构遗留系统的真实复盘

第一章&#xff1a;EF Core 10向量搜索扩展的架构定位与演进本质EF Core 10 向量搜索扩展并非孤立的功能补丁&#xff0c;而是微软在数据访问层深度整合 AI 原生能力的战略锚点。它标志着 ORM 从“关系映射”范式向“语义感知查询”范式的结构性跃迁——将向量计算能力下沉至查…...

从零入门性能测试:理论+JMETER实操,看完就能上手怯

一、环境准备 Free Spire.Doc for Python 是免费 Python 文档处理库&#xff0c;无需依赖 Microsoft Word&#xff0c;支持 Word 文档的创建、编辑、转换等操作&#xff0c;其中内置的 Markdown 解析能力&#xff0c;能高效实现 Markdown 到 Doc/Docx 格式的转换&#xff0c;且…...

Adobe-GenP:创意工具普惠化的技术破局实践

Adobe-GenP&#xff1a;创意工具普惠化的技术破局实践 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 一、问题象限&#xff1a;创意产业的授权困境与技术挑战 1.1…...

5步掌握labelCloud:打造专业级3D点云标注工作流

5步掌握labelCloud&#xff1a;打造专业级3D点云标注工作流 【免费下载链接】labelCloud A lightweight tool for labeling 3D bounding boxes in point clouds. 项目地址: https://gitcode.com/gh_mirrors/la/labelCloud 想要为你的自动驾驶项目或机器人视觉系统准备高…...