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>);

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

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

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

相关文章

Modbus TCP转CAN网关在不同行业中的应用以及其使用上的优势

倍讯科技Modbus TCP转CAN网关通常被用于工业自动化领域&#xff0c;特别是在需要连接现有Modbus TCP网络和CAN总线设备的场景中。以下是该网关在不同行业中的应用以及其使用上的优势&#xff1a; 1. 制造业&#xff1a; - 在制造业中&#xff0c;各种类型的设备和机器通常使用不…

Java项目实现报文数据校验注解方式(必输项、值大小)

普通项目 导入校验依赖 <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>4.1.0.Final</version></dependency><dependency><groupId>javax.validation</…

Docker安装Redis,并在 Visual Studio Code 中使用它

Docker安装Redis 查找Redis docker search Redis完整结果 PS C:\Users\cheng> docker search Redis NAME DESCRIPTION STARS OFFICIAL redis Redis is an open …

System V IPC(进程间通信)机制详解

文章目录 一、引言二、System V IPC的基本概念1、IPC结构的引入2、IPC标识符&#xff08;IPC ID&#xff09;3、S ystem V的优缺点 三、共享内存&#xff08;Shared Memory&#xff09;1、共享内存的基本概念2、共享内存的创建&#xff08;shmget&#xff09;3、共享内存的附加…

C++:并发保护

一、前言 本文将会通过保护一个数据讨论&#xff1a;互斥锁、双重检查锁、 std::once_flag 类、 std::call_once() 函数、单例模式、使用局部静态变量实现单例模式等。 二、保护共享数据 假设我们需要某个共享数据&#xff0c;而它创建起来开销不菲。因为创建它可能需要建立…

vim中的替换

:[range]s/pattern/replacement/flags 这里各部分的含义是&#xff1a; :[range]&#xff1a;可选的行范围&#xff0c;用于指定在哪些行之间进行替换。如果省略&#xff0c;则默认为当前行。例如&#xff0c;1,10 表示在第1行到第10行之间替换&#xff0c;% 表示在整个文件中…

python的文件操作及函数式编程介绍

五、文件操作 1、读取键盘输入 input 获取标准输入&#xff0c;数据类型统一为字符串 #!/usr/bin/python # -*- coding: UTF-8 -*- str input("请输入&#xff1a;") print&#xff08;"你输入的内容是: ", str&#xff09; 这会产生如下的对应着输入的…

KeyShot 2023.3 Pro for mac/win:完美融合3D渲染与动画制作

在当今数字化时代&#xff0c;视觉内容的创作和表现越来越受到重视。无论是产品设计、建筑规划&#xff0c;还是影视特效&#xff0c;都需要具备出色的3D渲染和动画制作工具来展现创意和想法。而作为业内领先的3D渲染和动画制作软件之一&#xff0c;KeyShot 2023.3 Pro在这个领…

电脑刚开机的时候不卡,用一会就变卡顿了…怎么回事?

前言 昨天咱们聊到旧电脑更换了固态硬盘之后&#xff0c;开机就会变快的事情&#xff0c;这个确实是可行且有效的升级电脑办法之一。 看完这篇之后&#xff0c;切莫着急升级电脑硬件配置&#xff0c;因为这里的坑比你想象的还要多。 从机械硬盘测试的数据和固态硬盘的测试数…

类与面向对象编程(Object-Oriented Programming, OOP)

类与面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;&#xff08;一&#xff09; 对象比较&#xff1a;‘is’ 对比 ‘’ 当我还是个孩子的时候&#xff0c;我们的邻居拥有一对双胞胎猫咪。它们看起来几乎一模一样—同样的炭黑色毛发和同样锐利的绿色…

2024年港口危货安全管理证报名条件

危化品安全员证报考条件 1、职业道德良好&#xff0c;身体健康&#xff0c;年龄不超过60周岁(法定代表人除外). 2、建筑施工企业的在职人员。 3、学历及要求: (1)建筑施工企业主要负责人应为大专以上学历&#xff0c;需大专以上学历&#xff0c;除企业法人外&#xff0c;其他…

linux进阶高级配置,你需要知道的有哪些(11)-YUM仓库服务与PXE网络装机

1、基于RPM包构建的软件更新机制 可以自动解决依赖关系 所有软件包由集中的YUM软件仓库提供 2、软件仓库的提供方式 FTP服务&#xff1a;ftp://...... HTTP服务&#xff1a;http://...... 本地目录&#xff1a;file:///...... 3、客户端YUM命令 &#xff08;1&#xff0…

从CSDN搬家到微信公众号

博主将会在微信公众号里不断输出精品内容&#xff0c;陪伴大家共同成长。 如果你对博主的经历感兴趣&#xff0c;或者对博主的IT技术感兴趣&#xff0c;欢迎关注我的微信公众号&#xff0c;阅读我的技术文章&#xff0c;免费获取各种IT资源。也可以加我的微信成为我的好友&…

档案数字化加工是如何利用档案的

档案数字化加工是将纸质档案转化为数字形式&#xff0c;并进行后续的加工和利用。通过档案数字化加工&#xff0c;可以实现以下几个方面的利用&#xff1a; 1. 存储和保护&#xff1a;数字化档案可以将大量的纸质档案存储在数字存储介质中&#xff0c;从而节省空间和维护成本。…

TypeScript学习日志-第二十五天(编写发布订阅模式)

编写发布订阅模式 这是更具订阅模式写的代码 可以理解订阅模式的思想 interface I {events:Map<string,Function[]>once:(event:string,callback:Function)>void // 触发一次on:(event:string,callback:Function)>void // 订阅emit:(event:string,...args:any[])…

FileUpload控件

FileUpload控件是一个在Web应用程序中常用的界面元素&#xff0c;它允许用户从客户端选择文件&#xff0c;并将该文件上传到Web服务器。以下是关于FileUpload控件的一些详细信息&#xff1a; 基本功能&#xff1a;FileUpload控件通常显示为一个文本框和一个“浏览”按钮。用户…

面试算法之哈希专题

赎金信 class Solution { public:bool canConstruct(string ransomNote, string magazine) {// 小写字母int r_cnt[26];int m_cnt[26];for(int i 0; i< magazine.size(); i) {m_cnt[magazine[i]-a]; // 统计}// 对比for(int i 0; i< ransomNote.size(); i) {if(m_cnt[r…

使用vant-ui+vue3实现一个可复用的评星组件

如图所示 有两种情况 一种是5颗星 一种是3颗星 官网上只提供了图标类型的 并没有加文字 https://femessage-vant.netlify.app/#/zh-CN/ 自己结合两种情况 在全局注册了此组件(后续还会持续更新代码~) <template><div class"vant_rate_wrapper"><van…

【Javaer学习Python】 1、Django安装

安装 Python 和 PyCharm 的方法就略过了&#xff0c;附一个有效激活PyCharm的链接&#xff1a;https://www.quanxiaoha.com/pycharm-pojie/pycharm-pojie-20241.html 1、安装Django # 安装Django pip install Django# 查看当前版本 python -m django --version 5.0.62、创建项…

HTML常用标签-表格标签

表格标签 1 常规表格2 单元格跨行3 单元格跨行 1 常规表格 table标签 代表表格 thead标签 代表表头 可以省略不写 tbody标签 代表表体 可以省略不写 tfoot标签 代表表尾 可以省略不写 tr标签 代表一行 td标签 代表行内的一格 th标签 自带加粗和居中效果的td 代码 <h…