JS中的宏任务和微任务

JavaScript 引擎是建立在一个事件循环系统之上的,它实时监控事件队列,如果有事件就执行,如果没有事件就等待。事件系统是一个典型的生产消费模式,生产者发出事件,接收者监听事件,在UI 开发中是常见的一个设计模式。在 JavaScript中,事件被定义为任务,有微任务和宏任务两种任务。

宏任务

对于浏览器,宏任务是 JavaScript要执行的代码,例如运行外部引入的脚本,页面上需要处理的用户点击事件,定时任务等等。每个宏任务执行完毕之后,才进行渲染,如果宏任务运行事件过长,会导致浏览器卡死,没有响应。创建宏任务最典型的方式就是 setTimeOut。
在这里插入图片描述

微任务

在每次宏任务运行完成之后,都会将本次宏任务中的待处理的微任务处理完成,所以微任务执行过程中,页面是不会进行渲染的。创建微任务,可以通过queueMicrotask 或者 Promise。如下图所示。

在这里插入图片描述
可以通过如下代码熟悉微任务和宏任务的处理、执行顺序。

console.log(1);

setTimeout(() => console.log(2));

Promise.resolve().then(() => console.log(3));

Promise.resolve().then(() => setTimeout(() => console.log(4)));

Promise.resolve().then(() => console.log(5));

setTimeout(() => console.log(6));

console.log(7);

#输出为
1 7 3 5 2 6 4

微任务和宏任务,对于队列来说,没有什么特别的,监听队列并执行任务,微任务放到当前宏任务完成之后再执行。根据宏任务的特性,当前任务完成之前是不更新页面的,如果在页面逻辑中,在同一个宏任务、微任务中更新了多次 Dom,那么实际上只有最后的更新才是有效的。JavaScript中最特别是 UI 处理方式,它不像 Android 和 iOS,它们都有专门做渲染的线程,要理解任务和 UI 渲染之间的关系。

在 React中,State 变化之后会进行组件的重新渲染,为了提高性能,setState 是通过异步的方式进行调用的,State 修改完成之后并不是立刻进行渲染。如果我们做这样一个效果,为用户提示错误信息 “请输入用户名!”,如果这个字段一直不填写,这个错误可能会提示多次。但是,由于 State 没有变化,第二次不会在提示,所以要先清一下错误信息,然后再更新,这里就需要在不同的宏任务中进行处理,代码如下:

function App() {
  const [error, setError] = useState(true);
  const [name, setName] = useState("test");

  const handleClick = () => {
    setName("")
    setTimeout(() => {
      setName(name)
    })
    
  };
  return (
    <div className="App">
      <AutoHideInput name={name}/>
      
      <input type="text" onChange={(e) => setName(e.target.value)}/>
      <button onClick={handleClick}>
        Click
      </button>
    </div>
  );

微任务和宏任务是前端的基础,在很多框架中都能看到他们的身影,需要理解透彻,一些渲染中的奇怪问题都可能与宏任务有关。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LVM - Linux磁盘逻辑卷管理器概念讲解及实践

1、lvm概念 逻辑卷管理器(LogicalVolumeManager)本质上是一个虚拟设备驱动,是在内核中块设备和物理设备之间添加的一个新的抽象层次,它可以将几块磁盘(物理卷,PhysicalVolume)组合起来形成一个存储池或者卷组(VolumeGroup)。LVM可以每次从卷组中划分出不同大小的逻辑卷(Logi…

InternLM-XComposer2-4KHD开拓性的4K高清视觉-语言模型

大型视觉-语言模型&#xff08;LVLM&#xff09;在图像字幕和视觉问答&#xff08;VQA&#xff09;等任务中表现出色。然而&#xff0c;受限于分辨率&#xff0c;这些模型在处理包含细微视觉内容的图像时面临挑战。 分辨率的限制严重阻碍了模型处理含有丰富细节的图像的能力。…

推荐5个实用的工具软件,提高效率

​ 现在&#xff0c;有很多实用的工具和软件可以帮助我们更高效地完成各种任务。以下是几个值得推荐的工具和软件&#xff0c;能够极大地提高我们的工作效率。 1.浏览器插件——SuperCopy ​ SuperCopy是一款浏览器插件&#xff0c;主要用于增强网页文本的复制功能。它解决了…

SQL注入工具sqlmap安装使用详解靶场实验

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、sqlmap简介 sqlmap 是一款开源的渗透测试工具&#…

主从Reactor服务器

目录&#xff1a; 目录&#xff1a; 目标&#xff1a; 本文讲解思路&#xff1a; 各模块的功能以及代码&#xff1a; 1.服务器相关模块&#xff1a;服务器模块的功能是对所有的连接以及线程进⾏管理 2.协议相关模块&#xff1a;协议模块是对当前的Reactor模型服务器提供应…

全球排名第一的质量管理(QMS)系统介绍,100%免费开源

什么是Odoo全程质量管理&#xff1f; 开源智造Odoo免费开源质量管理系统将政策、标准和实践规范化并自动化&#xff0c;以最小的开销提供最高质量的产品。快速轻松地选择要执行的测试&#xff0c;设置参数以评估结果&#xff0c;并定义接收时和生产过程中的测试策略。Odoo会自动…

Vue 快速入门:Vue初级

语法规则 前端渲染 渲染有几种方式&#xff1a;原生js、js模板、Vue模板语法 原生js 使用字符串拼接 js模板语法 Vue.js 模板语法概述 Vue.js 是一个用于构建用户界面的渐进式框架&#xff0c;其模板语法非常灵活和直观。Vue 的模板语法基于 HTML&#xff0c;可以通过指令…

达梦sql中参数个数太多导致出现SOH等特殊字符报错无效的序列号是不是达梦的bug

mybatis的Mapper.xml中如下&#xff1a; in中的参数大概有1万6千多个&#xff0c;分成每1000个一组拼接成sql&#xff0c;然而在达梦中执行时报如下: Caused by: dm.jdbc.driver.DMException: Invalid sequence noat dm.jdbc.driver.DBError.throwException(DBError.java:710)…

号卡极团分销管理系统 ue_serve.php 任意文件上传漏洞复现

0x01 产品简介 号卡极团分销管理系统,同步对接多平台,同步订单信息,支持敢探号一键上架,首页多套UI+商品下单页多套模板,订单查询支持实时物流信息、支持代理商自定义域名、泛域名绑定,内置敢探号、172平台、号氪云平台第三方接口以及号卡网同系统对接! 0x02 漏洞概述…

web入门练手案例(一)

下面是一下web入门案例和实现的代码&#xff0c;带有部分注释&#xff0c;倘若代码中有任何问题或疑问&#xff0c;欢迎留言交流~ 新闻页面 案例描述&#xff1a; 互联网的发展使信息的传递变得方便、快捷&#xff0c;浏览新闻称为用户获取信息的重要渠道。下面将实现一个简…

【doghead】mac与wsl2联通

mbp 设置为发送端,那么要能与windows上 wsl2的ubutnu通信。 mbp的 uv 构建ok zhangbin@zhangbin-mbp-2  ~/tet/Fargo/zhb-bifrost/Bifrost-202403/worker/third_party/libuv   main clion使用lldb cmake构建 更新git2.45.0啊

从零开始开发企业培训APP:在线教育系统源码剖析

今天&#xff0c;小编将深入剖析企业培训APP的开发&#xff0c;从零开始为企业构建一个高效、实用的在线教育系统。 一、需求分析 1.主要功能需求 包括但不限于&#xff1a; -用户管理 -课程管理 -学习计划 -互动功能 -考核评估 -统计分析 二、技术选型 1.前端技术 …

将jar打包成exe可安装程序,并在html页面唤醒

一、exe4j将jar打包成exe 1.exe4j下载 下载地址&#xff1a;https://www.ej-technologies.com/download/exe4j/files 2.exe4j打包jar 2.1. welcome 可以选择历史配置&#xff0c;新增则直接下一步 2.2. project type选择“jar in exe” mode 2.3. application info设置应用…

17-LINUX--线程与fork()

一.多线程程序fork() 多线程出现fork()后&#xff0c;只复制一条执行路径&#xff0c;是fork()所在的那条执行路径 主程序fork()示例代码&#xff1a; include<stdio.h> #include<stdlib.h> #include<string.h> #include<pthread.h> #include<un…

港股大反攻结束了吗?

‘港股长线见顶了吗&#xff1f;今天开盘就是最高点&#xff0c;然后一路跳水&#xff0c;市场又是一片恐慌。到底是健康的技术性回调&#xff0c;还是市场已经见顶&#xff1f; 港股此轮“大反攻”中&#xff0c;科网股表现十分亮眼。今日港股盘后&#xff0c;阿里巴巴、腾讯…

MySQL表的增删改查(1)

目录 一. . 新增 insert 1.简单方法 2. 指定列插入 3. 一次插入多行记录 二. 查询 select 1.最简单的查询, 全列查询 2. 指定列查询 ​编辑 3. 表达式查询 1)简单表达式查询 2)带别名的表达式查询 4. 去重查询 5. 带有排序的查询 1)单个列排序 2)多个列排序: ​…

Arduino-ILI9341驱动-SPI接口TFTLCD实现触摸功能系列之触控开关二

Arduino-ILI9341驱动-SPI接口TFTLCD实现触摸功能系列之触控开关二 1.概述 这篇文章在触摸屏上绘制一个开关&#xff0c;通过点击开关实现控制灯的开关功能。 2.硬件 硬件连接参考第一篇文章介绍 Arduino-ILI9341驱动-SPI接口TFTLCD实现触摸功能系列之获取触控坐标一 3.实现…

JETBRAINS IDES 分享一个2099通用试用码,支持一键升级!CLion 2024 版

文章目录 废话不多说上教程&#xff1a;&#xff08;动画教程 图文教程&#xff09;一、动画教程激活 与 升级&#xff08;至最新版本&#xff09; 二、图文教程 &#xff08;推荐&#xff09;Stage 1.下载安装 toolbox-app&#xff08;全家桶管理工具&#xff09;Stage 2 : 下…

一直可以正常 git push 代码,突然就不行了,提示端口22错误,访问超时!

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是当使用 git 时&#xff0c;突然提示端口错误&#xff0c;然后访问超时&#xff0c;我解决的过程以及最后的解决方案。 最新文章通过公众号「设计师工作日常」发布。 目录 不好意思&a…

手撕C语言题典——环形链表的约瑟夫问题

目录 前言 一.故事背景 二.题目 ​编辑三.思路 1&#xff09;数组 ​编辑2&#xff09; 循环链表 四.代码实现 搭配食用更佳哦~~ 数据结构之单单单——链表-CSDN博客 数据结构之单链表的基本操作-CSDN博客 前面学了单链表的相关知识&#xff0c;我们来尝试做一下关于…