理解宏任务和微任务:JavaScript 异步编程的必备知识(上)

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 1. 引言
    • 介绍宏任务和微任务的概念及作用
  • 2. 宏任务和微任务的区别和联系
    • 对比两者的区别和联系
  • 3. 宏任务和微任务的执行顺序
    • 阐述宏任务和微任务在事件循环中的执行顺序
    • 以示例说明不同类型任务的执行顺序

1. 引言

介绍宏任务和微任务的概念及作用

一、宏任务(Macro Task)

宏任务是指在 JavaScript 中需要等待整个脚本执行完毕后才会执行的任务。常见的宏任务包括:

  1. script(脚本):执行 JavaScript 代码。
  2. setTimeout 和 setInterval:用于设置延迟或定时执行的函数。
  3. I/O 操作:如文件读取、网络请求等。
  4. UI 渲染:浏览器重新渲染页面。

在这里插入图片描述

宏任务的作用是处理一些需要在整个脚本执行完毕后进行的操作,例如在页面加载完成后执行一些初始化代码、在用户操作后进行数据处理等。

二、微任务(Micro Task)

微任务是指在 JavaScript 中可以在当前任务执行完毕后立即执行的任务。常见的微任务包括:

  1. Promise 的回调函数:当 Promise 对象状态改变时(如 resolve 或 reject),注册的回调函数会被添加到微任务队列中。
  2. MutationObserver:用于监视 DOM 树的变化。
  3. Async/Await:异步函数的回调函数会被添加到微任务队列中。

在这里插入图片描述

微任务的作用是处理一些需要在当前任务执行完毕后立即执行的操作,例如在异步操作完成后进行后续处理、在用户操作后立即更新页面等。

宏任务和微任务的执行顺序是:先执行宏任务队列中的任务,当宏任务队列中的任务全部执行完毕后,再执行微任务队列中的任务。这种执行顺序确保了 JavaScript 代码的顺序执行,同时也提供了一种异步处理的方式。

2. 宏任务和微任务的区别和联系

对比两者的区别和联系

宏任务和微任务是 JavaScript 中的两个概念,它们在执行顺序和执行时机上有所不同。

  • 宏任务(Macro Task):宏任务是指需要等待当前 JavaScript 事件循环结束后才能执行的任务。常见的宏任务包括:setTimeout()setInterval()XMLHttpRequest 的回调函数、I/O 操作 等。宏任务会被放入事件队列中,等待当前事件循环的所有任务执行完毕后,才会按照事件队列中的顺序依次执行。

  • 微任务(Micro Task):微任务是指可以在当前 JavaScript 事件循环中立即执行的任务。常见的微任务包括:Promise 的回调函数、MutationObserver 的回调函数等。微任务会被放入微任务队列中,在当前事件循环的所有任务执行完毕后,会优先执行微任务队列中的任务,然后再执行事件队列中的宏任务。

宏任务和微任务的联系在于,它们都是 JavaScript 事件循环中的任务,都会按照一定的顺序执行。在执行顺序上,微任务会优先于宏任务执行。这意味着,如果在一个宏任务中创建了一个微任务,那么这个微任务会在当前事件循环中立即执行,而不会等待宏任务执行完毕。

3. 宏任务和微任务的执行顺序

阐述宏任务和微任务在事件循环中的执行顺序

宏任务和微任务在事件循环中的执行顺序如下:

  1. 执行当前事件循环中的所有宏任务。
  2. 检查微任务队列,如果有微任务,则执行微任务队列中的所有微任务。
  3. 如果有新的宏任务被添加到事件队列中,则回到步骤 1。

以示例说明不同类型任务的执行顺序

以下是一个简单的示例来说明不同类型任务的执行顺序:

console.log('start');setTimeout(() => {console.log('timeout');
}, 0);Promise.resolve().then(() => {console.log('promise');
});console.log('end');

在这个示例中,有三个任务:

  • console.log('start'):这是一个宏任务,会在当前事件循环中立即执行。
  • setTimeout(() => {console.log('timeout')}, 0):这是一个宏任务,它会被放入事件队列中,等待当前事件循环结束后执行。
  • Promise.resolve().then(() => {console.log('promise')}):这是一个微任务,它会被放入微任务队列中,在当前事件循环的所有任务执行完毕后立即执行。

因此,这个示例的输出结果是:

start
end
promise
timeout

可以看到,微任务 promise 先于宏任务 timeout 执行。这是因为微任务会在当前事件循环的所有任务执行完毕后立即执行,而宏任务需要等待当前事件循环结束后才能执行。

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

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

相关文章

react-native实践日记--5.ReactNative 项目版本升级,0.61到0.72升级的问题记录(一)

ReactNative的版本迭代太频繁,官方说的是React Native原则上每月发布一个新版本,且目前基本是向前不兼容的,导致项目升级很困难,各种依赖插件问题多多,下面是记录的升级中遇到的主要几个印象深刻的问题。 升级&#x…

教你5步学会用Llama2:我见过最简单的大模型教学

在这篇博客中,Meta 探讨了使用 Llama 2 的五个步骤,以便使用者在自己的项目中充分利用 Llama 2 的优势。同时详细介绍 Llama 2 的关键概念、设置方法、可用资源,并提供一步步设置和运行 Llama 2 的流程。 Meta 开源的 Llama 2 包括模型权重和…

Java开发项目之KTV点歌系统设计和实现

项目介绍 本系统实现KTV点歌管理的信息化,可以方便管理员进行更加方便快捷的管理。系统的主要使用者分为管理员和普通用户。 管理员功能模块: 个人中心、用户管理、歌曲库管理、歌曲类型管理、点歌信息管理。 普通用户功能模块: 个人中心…

一、CSharp_Basic:什么是.Net平台?什么是.Net FrameWork?什么是C#?

什么是.Net平台? 在了解C#之前,我们应该先了解一下什么是.Net平台。 .Net的诞生 2000年,这时候的微软凭借其Windows操作系统庞大的用户基数,推出了.Net1.0的标准。 也就是实现在Windows平台上面开发和应用程序的概念。我们可以简…

P3 Linux应用编程:系统调用与库函数

前言 🎬 个人主页:ChenPi 🐻推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ 🔥 推荐专栏2: 《Linux C应用编程(概念类)_ChenPi的博客-CSDN博客》✨✨✨ 🛸推荐专栏3: ​​​​​​《 链表_Chen…

shell脚本部署重启java服务

背景 一些小型项目未上k8s,直接在云服务器上部署,经常手动部署jar包,现记录常用shell脚本,里面都有注释,主要是重启服务。 #!/bin/bash# 定义应用程序名称和路径 JAR_NAME"demo-0.0.1.jar" JAR_PATH"…

BUUCTF [RoarCTF2019]黄金6年 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。 密文: 下载附件,得到.mp4文件。 attachment 解题思路: 1、浅浅的看了一遍,没发现什么有用的内容。放到Kinovea中,慢倍…

通用plantuml模板头

通用plantuml文件 startuml participant Admin order 0 #87CEFA // 参与者、顺序、颜色 participant Student order 1 #87CEFA participant Teacher order 2 #87CEFA participant TestPlayer order 3 #87CEFA participant Class order 4 #87CEFA participant Subject order …

轻量封装WebGPU渲染系统示例<42>- vsm阴影实现过程(源码)

前向实时渲染vsm阴影实现的主要步骤: 1. 编码深度数据,存到一个rtt中。 2. 纵向和横向执行遮挡信息blur filter sampling, 存到对应的rtt中。 3. 将上一步的结果(rtt)应用到可接收阴影的材质中。 具体代码情况文章最后附上的实现源码。 当前示例源码github地址: …

uniapp vue3.2+ts h5端分环境打包

根目录创建 package.json文件 {"name": "项目名称","version": "1.0.0","description": "","main": "main.js","scripts": {"test": "echo \"Error: no test…

力扣labuladong一刷day25天

力扣labuladong一刷day24天 一、870. 优势洗牌 题目链接:https://leetcode.cn/problems/advantage-shuffle/ 思路:这个就和田忌赛马是一样的,要求nums1[i]>nums2[i]才叫有优势,那么只需要把nums1和nums2都排序,逐…

react native 环境准备

一、必备安装 1、安装node 注意 Node 的版本应大于等于 16,安装完 Node 后建议设置 npm 镜像(淘宝源)以加速后面的过程(或使用科学上网工具)。 node下载地址:Download | Node.js设置淘宝源 npm config s…

zabbix_sender——向zabbix交互的sdk

zabbix给我们提供了win32的交互方法。地址为src\zabbix_sender\win32\zabbix_sender.c zabbix_sender_send_values 函数声明为: int zabbix_sender_send_values(const char *address, unsigned short port, const char *source,const zabbix_sender_value_t *values

GEE:梯度卷积

作者:CSDN @ _养乐多_ 本文将介绍在 Google Earth Engine(GEE)平台上,进行梯度卷积操作的代码框架、核心函数和多种卷积核,比如 Roberts、Prewitt、Sobel、各向同性算子、Compass算子、拉普拉斯算子、不同方向线性检测算子等。 结果如下图所示, 文章目录 一、常用的梯度…

数学建模之典型相关分析

发现新天地,欢迎访问 介绍 典型相关分析(Canonical Correlation analysis)研究两组变量(每组变量中都可能有多个指标)之间相关关系的一种多元统计方法。它能够揭示出两组变量之间的内在联系。 例子 我们要探究观众和业内人士对…

非应届生简历模板13篇

无论您是职场新人还是转行求职者,一份出色的简历都是获得心仪岗位的关键。本文为大家精选了13篇专业的非应届生简历模板,无论您的经验如何,都可以灵活参考借鉴,提升自己的简历质量。让简历脱颖而出,轻松斩获心仪职位&a…

16.字符串处理函数——字符串长度函数

文章目录 前言一、题目描述 二、解题 程序运行代码 总结 前言 本系列为字符串处理函数编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 二、解题 程序运行代码 #include<stdio.h> #include<string.h> int main() {char str[ ]"0123\0456…

Java基础——方法可变长参数

JavaSE 5.0中提供了Varargs&#xff08;variable number of arguments&#xff09;机制&#xff0c;允许直接定义能和多个实参相匹配的形参。 声明格式&#xff1a; [访问权限修饰符] [其他修饰符] 返回值类型 方法名(形参列表&#xff0c;参数类型... 参数名) {//方法体; }说…

mac安装解压缩rar后缀文件踩坑

mac默认能够解压缩zip后缀的文件&#xff0c;如果是rar后缀的自己需要下载相关的工具解压 下载地址&#xff1a; https://www.rarlab.com/download.htm mac我是因特尔芯片所以下载 x64 然后解压缩文件进入目录 rar中 将可执行文件 rar、unrar 移动到 /usr/local/bin目录下即…

[架构之路-254]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 架构设计 - 全程概述

目录 一、软件架构概述 1.1 什么是软件架构 1.2 为什么需要软件架构设计 1.3 软件架构设计在软件设计中位置 &#xff08;1&#xff09;软件架构设计&#xff08;层次划分、模块划分、职责分工&#xff09;&#xff1a; &#xff08;2&#xff09;软件高层设计、概要设计…