Js中的微任务和宏任务

news2024/10/5 6:27:09

1.前言

任务可以分成两种,一种是同步任务(synchronous),另一种是异步(asynchronous),异步任务又分为宏任务和微任务。

同步任务:在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
异步任务:不进入主线程、而进入"任务队列"(task queue)的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行

console.log("这是开始");

function fn1() {
  console.log("这是一条消息2");
  fn2();
}

function fn2() {
  console.log("这是一条消息3");
}

setTimeout(function cb1() {
  console.log("这是来自第一个回调的消息");
});

console.log("这是一条消息1");
fn1();

setTimeout(function cb2() {
  console.log("这是来自第二个回调的消息");
}, 0);

console.log("这是结束");
//输出的结果:
//这是开始
//这是一条消息1
//这是一条消息2
//这是一条消息3
//这是结束
//这是来自第一个回调的消息
//这是来自第二个回调的消息

在这里插入图片描述

2.什么是微任务?什么是宏任务?分别都有哪些?

在 JavaScript 中,宏任务和微任务是用来管理异步操作的概念。

宏任务代表一组要在主线程中执行的 JavaScript 代码。它们通常包括以下几种情况:

  1. 整体代码script:由多行代码组成的完整,可执行的程序代码,如<script>js代码</script>
  2. setTimeout 和 setInterval:通过定时器触发的代码。
  3. I/O 操作:包括读取文件、发送网络请求等异步操作。
  4. UI 渲染:DOM渲染,即更改代码重新渲染DOM的过程。
  5. requestAnimationFrame:在下一次页面重绘之前执行的操作。

宏任务之间的执行顺序:setTimeout --> setInterval --> i/o操作 --> 异步ajax

微任务是一组需要在当前任务执行完成后尽快执行的 JavaScript 代码。它们在事件循环的当前阶段结束后立即执行,而不是等待下一个宏任务执行。常见的微任务包括:

  1. Promise 回调(then,catch,finally):Promise 的处理函数会作为微任务执行。
  2. MutationObserver:用于监听 DOM 变化的 API。
    3.Object.observe:用来实时监听js中对象的变化
  3. process.nextTick(Node.js 环境下):将回调函数放入微任务队列中。

微任务之间的执行顺序:process.nextTick --> Promise

当 JavaScript 引擎执行代码时,它会先执行当前的宏任务,然后检查微任务队列是否为空。如果微任务队列不为空,引擎会依次执行微任务,直到微任务队列为空。接着,引擎会继续执行下一个宏任务。这个过程不断循环,形成了事件循环(event loop),如下图所示。
微任务和宏任务的执行顺序

理解宏任务和微任务的执行顺序对于理解 JavaScript 异步编程很重要。宏任务通常会在一个事件循环的阶段结束后执行,而微任务则会在当前任务执行完成后立即执行。这就意味着微任务可以在宏任务之前执行,因此它们具有更高的优先级。

3.案例

案例一

const promise = new Promise((resolve, reject) => {
  console.log(1);
  setTimeout(() => {
    console.log("timerStart");
    resolve("success");
    console.log("timerEnd");
  }, 0);
  console.log(2);
});
promise.then((res) => {
  console.log(res);
});
console.log(4);

输入结果:

1
2
4
timerStart
timerEnd
success

结果分析:

  1. 首先遇到Promise构造函数,会先执行里面的内容,打印 1 ;
  2. 遇到定时器 steTimeout ,它是一个宏任务,放入宏任务队列;
  3. 继续向下执行,打印出2;
  4. 由于 Promise 的状态此时还是 pending ,所以 promise.then 先不执行;
  5. 继续执行下面的同步任务,打印出4;
  6. 此时微任务队列没有任务,继续执行下一轮宏任务,执行 steTimeout ;
  7. 首先执行 timerStart ,然后遇到了 resolve ,将 promise 的状态改为 resolved 且保存结果并将
  8. 之前的 promise.then 推入微任务队列,再执行 timerEnd ;
  9. 执行完这个宏任务,就去执行微任务 promise.then ,打印出 resolve 的结果。

案例2

Promise.resolve().then(() => {
  console.log('promise1');
  const timer2 = setTimeout(() => {
    console.log('timer2')
  }, 0)
});
const timer1 = setTimeout(() => {
  console.log('timer1')
  Promise.resolve().then(() => {
    console.log('promise2')
  })
}, 0)
console.log('start');

输出结果:

start
promise1
timer1
promise2
timer2

结果分析:

  1. 首先, Promise.resolve().then 是一个微任务,加入微任务队列
  2. 执行timer1,它是一个宏任务,加入宏任务队列
  3. 继续执行下面的同步代码,打印出 start
  4. 这样第一轮宏任务就执行完了,开始执行微任务 Promise.resolve().then ,打印出 promise1
  5. 遇到 timer2 ,它是一个宏任务,将其加入宏任务队列,此时宏任务队列有两个任务,分别是
    timer1 、 timer2 ;
  6. 这样第一轮微任务就执行完了,开始执行第二轮宏任务,首先执行定时器 timer1 ,打印
    timer1 ;
  7. 遇到 Promise.resolve().then ,它是一个微任务,加入微任务队列
  8. 开始执行微任务队列中的任务,打印 promise2 ;
  9. 最后执行宏任务 timer2 定时器,打印出 timer2 ;

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

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

相关文章

C++11 -- 右值引用和移动语义

文章目录 基本概念左值和左值引用右值和右值引用 右值引用和移动语义的意义和使用场景左值引用与右值引用比较右值引用的特殊场景左值引用的短板右值引用和移动语义 完美转发模板中的&&万能引用完美转发在传参过程中保留原生类型属性完美转发实际中的使用场景 基本概念…

如何用ChatGPT分析品牌舆论传播概况,并给到处理建议?

该场景对应的关键词库&#xff08;25个&#xff09;&#xff1a; 舆论传播、数据分析、主题、事件、时间段、媒体渠道、数据来源、情感分析、关键词提取、主题挖掘、大众集中讨论的话题、讨论关注程度、舆论关注倾向、关联类似事件、聚焦某一种情绪、人群范围、事件涉及群体、谁…

企业电子招标采购系统源码java 版本 Spring Cloud + Spring Boot

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…

程序员的职场,光有技术是不行的,送给每个即将工作的程序员

又是一年五月份&#xff0c;大批量学计算机的学生又要涌入职场了&#xff0c;牛皮的已经早早找到了工作&#xff0c;但不管你技术再牛&#xff0c;在程序员的职场&#xff0c;光有技术是不行的&#xff0c;你还要懂得一些职场的雷坑和上升技巧。 我做了二十多年程序员&#xf…

Stable diffusion教程 - 提示词汉化

1. 介绍 安装stable diffusion后&#xff0c;可能英语不熟悉&#xff0c;可能提示词不熟悉&#xff0c;写提示词就比较困难。 这款提示词汉化插件&#xff0c;配合中文词库输入中文就能提示相关提示词&#xff0c;用起来超级方便&#xff0c;示例如下&#xff1a; 输入“花”…

windows下搭建局域网的mysql.md

场景&#xff1a;公司的需要搭建一个局域网的mysql服务器&#xff0c;利用phpstudy傻瓜式安装后&#xff0c;用本机访问&#xff0c;提示 1130 - Host ‘DESKTOP-IRSGN4A’ is not allowed to connect to this MySQL server mysql 安装软件 1、命令行进入mysql 首先我们需要进…

Python基础入门编程代码练习(六)

一、模拟房产经纪人来管理房屋信息 编写业务实现 家具类&#xff1a;HouseItem 属性&#xff1a;名字 name&#xff0c;占地面积 area 方法&#xff1a;__init__ , __str__ 类名&#xff1a;房子类 House 属性&#xff1a;户型 name&#xff0c;总面积&#xff1a;total_are…

为什么编程都建议不要用拼音命名

一、场景 我们看看知乎答主举的搞笑例子&#xff0c;一句话全部都是shi&#xff0c;表达起来确实困难。 二、原因 上面这个回答&#xff0c;一句话全部都是“shi”&#xff0c;表达起来确实困难。并且让人误解 那么编程都建议不要用拼音命名&#xff0c;主要有以下原因&…

数据结构_栈、队列和数组

目录 1. 栈 1.1 栈的定义 1.2 栈的基本操作 1.3 栈的顺序存储结构 1.3.1 顺序栈 1.3.2 顺序栈的基本运算 1.3.3 共享栈 1.4 栈的链式存储 1.5 栈相关应用 2. 队列 2.1 队列的定义 2.2 队列的基本操作 2.3 队列的顺序存储 2.4 循环队列 2.4.1 循环队列的操作 2.…

2023年全国职业院校技能大赛-大数据应用开发-数据可视化

可视化题目与以往相同&#xff0c;做法类似&#xff0c;我这里展示得到语句后处理优化以后的代码&#xff0c;以函数式来写可视化&#xff0c;比以前400-500多行代码简洁到100多行。其他题目见本栏目&#xff0c;那里面的代码都是没有优化后的&#xff0c;这次主要以效率和精简…

提升曝光率!掌握Facebook帖子关键词采集技巧

如何提高Facebook帖子的曝光率成为了每个营销人员的关注焦点。掌握Facebook帖子关键词采集技巧&#xff0c;可以帮助你更好地定位受众&#xff0c;增加帖子的曝光和点击率。在本文中&#xff0c;我们将详细介绍一些有效的技巧和策略&#xff0c;让你成为Facebook帖子关键词的专…

不到1分钟,帮你剪完旅行vlog,火山引擎全新 AI「神器」真的这么绝?

旅行时&#xff0c;想在社交平台发布一支精美的旅行 vlog&#xff0c;拍摄剪辑需要花费多长时间&#xff1f; 20 分钟&#xff1f;一小时&#xff1f;半天&#xff1f; 在火山引擎算法工程师眼里&#xff0c;可能 1 分钟都用不了&#xff0c;因为会有 AI 替你完成。 没错&#…

安装-唯一客服系统文档中心

环境要求 Mysql > 5.6IIS/Apache/Nginx(只推荐nginx) 宝塔一键部署 前往 【软件商店】>【一键部署】>【导入项目】 客服项目本身不需要PHP环境&#xff0c;因此PHP版本那里&#xff0c;随意根据自己环境写上就可以 导入完成以后&#xff0c;点击一键部署&#xff0c;填…

matlab实验四插值与数据拟合

一、实验目的及要求 一、实验的目的与要求&#xff1a; 1、掌握 MATLAB的一维数据插值法 2、通过比较不同次数的多项式拟合效果&#xff0c;了解多项式拟合的原理 3、掌握 MATLAB的多项式拟合的特点和方法 4、掌握 MATLAB的多项式表示与运算 二、实验原理 1、Matlab中&#xff…

基于QEMU的RISC-V架构linux系统开发(一)——RISC-V交叉编译器的安装

基于RISC-V交叉编译器包括32bit和64bit两种类型&#xff0c;其中每种类型又包括裸机版本&#xff08;newlib&#xff09;和动态链接库版本&#xff08;linux glibc&#xff09;。不同类型、版本的gcc的安装仅在配置文件上存在差异&#xff0c;具体安装流程&#xff08;以64bit …

以数据思维和技能提升数据应用测试实践 | 京东云技术团队

作者&#xff1a;京东零售 周雪梅 以数据思维和技能提高测试覆盖率和效率。数据应用测试&#xff0c;功能测试主要聚焦在数据流向&#xff08;输入和输出&#xff09;。 一、背景 数据质量组当前主要承接黄金眼和商智中的供应链模块&#xff0c;商智包括PC&#xff08;品牌版…

Access、Foxpro、Foxbase,2023年找到完美代替,有Excel基础即可

你还记得上世纪80年代的Foxbase和Foxpro吗&#xff1f; 数据库软件作为基础软件是计算机系统稳定运行的基石。 像Foxbase和Foxpro&#xff0c;很多计算机专业的前辈都应该听说过&#xff0c;当时的风靡程度一点也不亚于现在的微软office。 FoxPro和Foxbase是诞生于1984年。具…

玩机搞机-----安卓全机型 ADB FAST 各种指令解析说明与操作【二】基础联机

安卓全机型 玩机 搞机 ADB FAST 各种指令解析说明与操作_adb线刷命令_安卓机器的博客-CSDN博客 今天对上个帖子不足的地方进行补正。方便友友进行基础的联机操作&#xff0c;很多时候我们用adb指令的时候会有各种奇奇怪怪的问题。例如同一个机型&#xff0c;同一个指令。有时候…

使用svg在元素直接绘制连线箭头

注意&#xff1a;svg的图形绘制的点位置坐标是基于画布的位置坐标&#xff0c;相当于从左上角的点为起点。 先来个简单示例&#xff1a; 在点与点之间绘制连线箭头 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…

cookie、session、token的区别是什么

前言 今天就来说说session、cookie、token这三者之间的关系&#xff01;最近这仨玩意搞得头有点大&#x1f923; 1.为什么会有它们三个&#xff1f; 我们都知道 HTTP 协议是无状态的&#xff0c;所谓的无状态就是客户端每次想要与服务端通信&#xff0c;都必须重新与服务端链接…