当前位置: 首页 > news >正文

宏任务和微任务的区别

在 JavaScript 的异步编程模型中,宏任务(Macro Task)和微任务(Micro Task)是事件循环(Event Loop)机制中的两个重要概念。它们用于管理异步操作的执行顺序。


1. 宏任务 (Macro Task)

宏任务是较大的任务块,它们在事件循环的每一轮迭代中按顺序执行。常见的宏任务包括:

  • setTimeoutsetInterval
  • setImmediate (Node.js 环境)
  • I/O 操作
  • UI 渲染
宏任务的执行流程
  • 每次事件循环从宏任务队列中取出一个任务执行。
  • 当一个宏任务执行完后,会检查微任务队列是否为空,如果不为空,优先执行所有微任务队列中的任务。
  • 之后,事件循环继续进入下一个宏任务。

2. 微任务 (Micro Task)

微任务是更细粒度的任务,比宏任务优先级更高。微任务会在当前宏任务执行完后立即执行,并在下一个宏任务开始之前完成。

常见的微任务包括:

  • Promise.then/catch/finally
  • MutationObserver
  • queueMicrotask
微任务的执行流程
  • 当前宏任务执行完毕后,立即执行所有的微任务,直到微任务队列为空。
  • 新增的微任务会被加入当前微任务队列,直到所有微任务都完成。

宏任务和微任务的区别

特性宏任务 (Macro Task)微任务 (Micro Task)
优先级优先级低,执行顺序在微任务之后优先级高,当前宏任务执行后立即执行
典型场景setTimeout、setInterval、I/O、UI 渲染等Promise.then、queueMicrotask 等
执行时机每次事件循环的起始阶段当前宏任务完成后,下一个宏任务之前

实际示例

以下代码展示了宏任务和微任务的执行顺序:

console.log('开始'); // 同步任务setTimeout(() => {console.log('宏任务:setTimeout');
}, 0);Promise.resolve().then(() => {console.log('微任务:Promise');
});console.log('结束'); // 同步任务

执行顺序:

  1. 同步任务:输出 '开始'
  2. 同步任务:输出 '结束'
  3. 微任务:输出 '微任务:Promise'
  4. 宏任务:输出 '宏任务:setTimeout'

图解事件循环

  1. 同步任务直接进入主线程执行。
  2. 微任务进入微任务队列。
  3. 宏任务进入宏任务队列。

事件循环的顺序为:

  • 执行主线程的同步代码。
  • 清空微任务队列。
  • 执行一个宏任务(从宏任务队列中取出)。
  • 回到第二步,重复以上流程。

关键点总结

  • 微任务优先级高于宏任务。
  • 微任务适用于需要尽快执行的逻辑(如 Promise 的回调)。
  • 宏任务适用于稍后执行的逻辑(如计时器或 I/O 操作)。

了解这些机制,可以帮助我们更好地调试和优化 JavaScript 代码的异步行为。

http://www.lryc.cn/news/512003.html

相关文章:

  • 数据库系统原理复习汇总
  • Linux day1204
  • 如何在 Ubuntu 22.04 上安装并开始使用 RabbitMQ
  • 【OpenGL ES】GLSL基础语法
  • 如何使用交叉编译器调试C语言程序在安卓设备中运行
  • Java全栈项目 - 智能考勤管理系统
  • Linux Shell : Process Substitution
  • JOGL 从入门到精通:开启 Java 3D 图形编程之旅
  • 汽车网络安全基线安全研究报告
  • Eclipse 修改项目栏字体大小
  • 【PCIe 总线及设备入门学习专栏 5.1 -- PCIe 引脚 PRSNT 与热插拔】
  • 【YOLO】YOLOv5原理
  • uniapp中wx.getFuzzyLocation报错如何解决
  • opencv图像直方图
  • OpenCV计算机视觉 03 椒盐噪声的添加与常见的平滑处理方式(均值、方框、高斯、中值)
  • 【嵌入式C语言】内存分布
  • 【brainpan靶场渗透】
  • Java实现观察者模式
  • 通过百度api处理交通数据
  • 探索CSDN博客数据:使用Python爬虫技术
  • b站ip属地评论和主页不一样怎么回事
  • 如何查看服务器内存占用情况?
  • 流架构的读书笔记(2)
  • E6 中的 扩展运算符(Spread) 和 剩余运算符(Rest)
  • Python的简单爬虫框架
  • 使用 uni-app 开发的微信小程序中,如何在从 B 页面回来时,重新拉取数据?
  • Windows API Set:那些“只存在但不被使用“的DLL
  • 黑神话悟空鼠标光标分享
  • 编写一个简单的引导加载程序(bootloader)
  • 【Linux基础】进程(上) —— 概念、状态、优先级与环境变量