宏任务和微任务

在前端开发中,**宏任务(Macro Task)**和**微任务(Micro Task)**是 JavaScript 事件循环(Event Loop)中的两个重要概念。它们决定了异步代码的执行顺序。

---

### 1. **事件循环(Event Loop)**
JavaScript 是单线程的,通过事件循环机制处理异步任务。事件循环的核心是:
- **主线程**:执行同步代码。
- **任务队列**:存放异步任务的回调函数。
- **事件循环**:不断检查任务队列,将任务推入主线程执行。

任务队列分为两种:
- **宏任务队列**:存放宏任务。
- **微任务队列**:存放微任务。

---

### 2. **宏任务(Macro Task)**
宏任务是指需要较长时间执行的任务,通常包括:
- `setTimeout` 和 `setInterval` 的回调。
- `setImmediate`(Node.js 特有)。
- `requestAnimationFrame`(浏览器特有)。
- I/O 操作(如文件读写、网络请求)。
- UI 渲染(浏览器特有)。

**执行时机**:每次事件循环中,主线程会执行一个宏任务,然后检查微任务队列。

---

### 3. **微任务(Micro Task)**
微任务是指需要尽快执行的任务,通常包括:
- `Promise` 的回调(`then`、`catch`、`finally`)。
- `MutationObserver`(监听 DOM 变化)。
- `process.nextTick`(Node.js 特有)。

**执行时机**:每次宏任务执行完毕后,事件循环会清空微任务队列中的所有任务,然后再执行下一个宏任务。

---

### 4. **执行顺序**
事件循环的执行顺序如下:
1. 执行主线程的同步代码。
2. 执行当前宏任务。
3. 清空微任务队列中的所有任务。
4. 执行 UI 渲染(浏览器)。
5. 执行下一个宏任务。

---

### 5. **代码示例**
```javascript
console.log('1. 同步代码'); // 同步代码,立即执行

setTimeout(() => {
  console.log('4. 宏任务 - setTimeout'); // 宏任务
}, 0);

Promise.resolve().then(() => {
  console.log('3. 微任务 - Promise'); // 微任务
});

console.log('2. 同步代码'); // 同步代码,立即执行
```

**输出结果**:
```
1. 同步代码
2. 同步代码
3. 微任务 - Promise
4. 宏任务 - setTimeout
```

**解释**:
1. 同步代码立即执行。
2. `Promise` 的微任务在同步代码之后、宏任务之前执行。
3. `setTimeout` 的宏任务在微任务之后执行。

---

### 6. **宏任务和微任务的区别**
| 特性            | 宏任务(Macro Task)               | 微任务(Micro Task)               |
|-----------------|------------------------------------|------------------------------------|
| **执行时机**     | 每次事件循环执行一个宏任务         | 每次宏任务执行后清空微任务队列     |
| **常见任务**     | `setTimeout`、`setInterval`、I/O   | `Promise`、`MutationObserver`      |
| **优先级**       | 较低                               | 较高                               |
| **队列类型**     | 宏任务队列                         | 微任务队列                         |

---

### 7. **实际应用**
- **优化性能**:将高优先级任务放入微任务队列,确保尽快执行。
- **避免阻塞**:将耗时任务放入宏任务队列,避免阻塞主线程。
- **控制执行顺序**:通过微任务和宏任务的特性,控制异步代码的执行顺序。

---

### 总结
- **宏任务**:需要较长时间执行的任务,如 `setTimeout`、I/O 操作。
- **微任务**:需要尽快执行的任务,如 `Promise`、`MutationObserver`。
- **执行顺序**:同步代码 → 微任务 → 宏任务 → UI 渲染 → 下一个宏任务。

理解宏任务和微任务的机制,有助于更好地掌握 JavaScript 的异步编程和事件循环。

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

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

相关文章

人工智能 - 机器学习、深度学习、强化学习是人工智能领域的理论基础和方法论

机器学习、深度学习、强化学习是人工智能领域的三大核心方向,各自具有独特的理论基础和方法论。以下是它们的核心理论知识总结: 一、机器学习(Machine Learning, ML) 1. 基础概念 目标:通过数据驱动的方式,让机器从经验中学习规律,完成预测、分类或决策任务。 核心范式…

java处理pgsql的text[]类型数据问题

背景 公司要求使用磐维数据库,于是去了解了这个是基于PostgreSQL构建的,在使用时有场景一条图片数据中可以投放到不同的页面,由于简化设计就放在数组中,于是使用了text[]类型存储;表结构 #这是一个简化版表结构&…

. Unable to find a @SpringBootConfiguration(默认软件包中的 Spring Boot 应用程序)

解决: 新建一个包即可 问题: 默认软件包中的 Spring Boot 应用程序。 原因: 默认包的定义 : 如果一个 Java 类没有使用 package 声明包名,则该类会被放置在默认包中。Spring Boot 遵循 Java 的包管理约定&#xff…

C语言——排序(冒泡,选择,插入)

基本概念 排序是对数据进行处理的常见操作,即将数据按某字段规律排列。字段是数据节点的一个属性,比如学生信息中的学号、分数等,可针对这些字段进行排序。同时,排序算法有稳定性之分,若两个待排序字段一致的数据在排序…

渗透利器:YAKIT 工具-基础实战教程.

YAKIT 工具-基础实战教程. YAKIT(Yak Integrated Toolkit)是一款基于Yak语言开发的集成化网络安全单兵工具,旨在覆盖渗透测试全流程,提供从信息收集、漏洞扫描到攻击实施的自动化支持。其核心目标是通过GUI界面降低Yak语言的使用…

CRISPR spacers数据库;CRT和PILER-CR用于MAGs的spacers搜索

iPHoP:病毒宿主预测-CSDN博客 之前介绍了这个方法来预测病毒宿主,今天来介绍另一种比较用的多的方法CRISPR比对 CRISPR spacers数据库 Dash 在这可以下载作者搜集的spacers用于后期比对 CRT和PILER-CR 使用 CRT 和 PILERCR 识别 CRISPR 间隔区&#x…

模糊聚类分析方法:从模糊等价矩阵到动态分类

一、模糊聚类分析的核心思想 在实际工程技术和经济管理问题中,我们常常需要对对象进行分类。例如,根据生物特征对物种分类、根据气候特征对城市分类、根据用户行为对客户群体分类等。传统的聚类分析基于清晰的分类边界,但现实中许多分类问题…

DeepSeek从入门到精通:提示词设计的系统化指南

目录 引言:AIGC时代的核心竞争力 第一部分 基础篇:提示词的本质与核心结构 1.1 什么是提示词? 1.2 提示词的黄金三角结构 第二部分 类型篇:提示词的六大范式 2.1 提示语的本质特征 2.2 提示语的类型 2.2.1 指令型提示词 …

【EDA学习】嘉立创题库

一、多选题 1.嘉立创题库的作用是什么,以下描述正确的是? A.提供学习平台,帮助客户了解嘉立创工艺 B.可成为嘉立创客户所在企业的内部培训资料,打通设计与制造,提高产品研发效率,降本增效 C.可成为嘉立创客…

Python PyCharm DeepSeek接入

Python PyCharm DeepSeek接入 创建API key 首先进入DeepSeek官网,https://www.deepseek.com/ 点击左侧“API Keys”,创建API key,输出名称为“AI” 点击“创建",将API key保存,复制在其它地方。 在PyCharm中下…

对界面简单易用封装SDK

1.三大接口 1.CheckTuple package com.x.globalcommonservice.model.permissioncontrolservice.openfga.service;import com.x.globalcommonservice.global.exception.CodeException; import com.x.globalcommonservice.model.permissioncontrolservice.openfga.dto.tuple.Op…

【Pico】使用Pico进行无线串流搜索不到电脑

使用Pico进行无线串流搜索不到电脑 官串方式:使用Pico互联连接电脑。 故障排查 以下来自官方文档 请按照以下步骡排除故障: 确认电脑和一体机连接了相同的路由器WiFi网络(相同网段) IP地址通常为192.168.XX,若两设备的IP地址前三段相同&…

[免费]Springboot+Vue医疗(医院)挂号管理系统【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的SpringbootVue医疗(医院)挂号管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue医疗(医院)挂号管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 在如今社会上,关于信息上…

【一文读懂】WebRTC协议

WebRTC(Web Real-Time Communication)协议 WebRTC(Web Real-Time Communication)是一种支持浏览器和移动应用程序之间进行 实时音频、视频和数据通信 的协议。它使得开发者能够在浏览器中实现高质量的 P2P(点对点&…

沃德校园助手系统php+uniapp

一款基于FastAdminThinkPHPUniapp开发的为校园团队提供全套的技术系统及运营的方案(目前仅适配微信小程序),可以更好的帮助你打造自己的线上助手平台。成本低,见效快。各种场景都可以自主选择服务。 更新日志 V1.2.1小程序需要更…

Linux 系统上以 root 用户身份运行 ./mysql.server start 命令,但仍然收到 “Permission denied” 错误

如图 1 所示,当在 Linux 系统上以 root 用户身份运行 ./mysql.server start 命令,但仍然收到 “Permission denied” 错误时,这通常不是由于权限不足(因为您已经是 root 用户),而可能是由于 mysql.server 脚…

Android的Activity生命周期知识点总结,详情

一. Activity生命周期 1.1 返回栈知识点 二. Activity状态 2.1 启动状态 2.2 运行状态 2.3 暂停状态 2.4 停止状态 2.5 销毁状态 三. Activity生存期 3.1 回调方法 3.2 生存期 四. 体验Activity的生命周期 五. Activity被回收办法 引言: 掌握Acti…

Python----PyQt开发(PyQt基础,环境搭建,Pycharm中PyQttools工具配置,第一个PyQt程序)

一、QT与PyQT的概念和特点 1.1、QT QT是一个1991年由The Qt Company开发的跨平台C图形用户界面应用程序开发 框架,可构建高性能的桌面、移动及Web应用程序。也可用于开发非GUI程序,比如 控制台工具和服务器。Qt是面向对象的框架,使用特殊的代…

win10 系统 自定义Ollama安装路径 及模型下载位置

win10 系统 自定义Ollama安装路径 及模型下载位置 由于Ollama的exe安装软件双击安装的时候默认是在C盘,以及后续的模型数据下载也在C盘,导致会占用C盘空间,所以这里单独写了一个自定义安装Ollama安装目录的教程。 Ollama官网地址&#xff1…

微软官方出品GPT大模型编排工具:7个开源项目

今天一起盘点下,12月份推荐的7个.Net开源项目(点击标题查看详情)。 1、一个浏览器自动化操作的.Net开源库 这是一个基于 Google 开源的 Node.js 库 Puppeteer 的 .NET 开源库,方便开发人员使用无头 Web 浏览器抓取 Web、检索 Ja…