微任务和宏任务有什么区别

简介: 微任务和宏任务是JavaScript异步编程中的两个概念。宏任务包括整体代码块、setTimeout等,微任务有Promise、MutationObserver等。主要区别在于执行时机:每次事件循环中,宏任务只执行一个,而微任务会在当前宏任务结束后、下一个宏任务开始前全部执行完毕。
  1. 定义与概念

    • 宏任务(Macro - Task):宏任务是浏览器或JavaScript运行环境中的一个较大的任务单元,通常包括一些比较耗时或者不那么紧急的操作。例如,script(整体脚本)、setTimeoutsetIntervalI/O操作(如Ajax请求)、postMessageMessageChannel等都属于宏任务。它们构成了任务队列(Task Queue)中的主要部分,这些任务的执行顺序遵循一定的规则,在事件循环(Event Loop)中按顺序逐个被处理。
    • 微任务(Micro - Task):微任务是一种相对较小、更紧急的任务,它们通常是在当前宏任务执行结束后,下一个宏任务开始之前需要立即执行的任务。常见的微任务包括Promise.then()MutationObserverprocess.nextTick(在Node.js环境下)等。微任务队列(Micro - Task Queue)用于存储这些微任务,并且在宏任务执行间隙优先清空微任务队列。
  2. 执行顺序与时机

    • 宏任务执行顺序:在JavaScript的单线程执行模型中,首先执行全局script代码,这是第一个宏任务。当这个宏任务执行过程中遇到异步的宏任务(如setTimeout),会将其回调函数添加到宏任务队列的末尾。只有当当前宏任务以及微任务队列都为空时,才会从宏任务队列中取出下一个宏任务执行。例如:
      console.log('Script start');
      setTimeout(() => {
             
      console.log('Timeout 1');
      }, 0);
      setTimeout(() => {
             
      console.log('Timeout 2');
      }, 0);
      console.log('Script end');
      
    • 在这个例子中,首先执行script这个宏任务,打印Script start,然后遇到两个setTimeout,它们的回调函数被添加到宏任务队列。接着打印Script end,此时当前宏任务结束。由于微任务队列没有任务,所以开始从宏任务队列中取出任务执行,先执行第一个setTimeout的回调函数打印Timeout 1,再执行第二个setTimeout的回调函数打印Timeout 2
    • 微任务执行顺序:在每个宏任务执行结束后,JavaScript引擎会立即检查微任务队列。如果微任务队列中有任务,会按照先进先出(FIFO)的顺序依次执行这些微任务,直到微任务队列清空。例如:
      console.log('Script start');
      const promise1 = Promise.resolve();
      promise1.then(() => {
             
      console.log('Promise 1');
      });
      const promise2 = Promise.resolve();
      promise2.then(() => {
             
      console.log('Promise 2');
      });
      console.log('Script end');
      
    • 在这里,首先执行script宏任务,打印Script start。然后promise1promise2.then回调函数作为微任务被添加到微任务队列。接着打印Script end,此时当前宏任务结束,开始执行微任务队列中的任务,按照添加顺序先打印Promise 1,再打印Promise 2
  3. 对应用性能和行为的影响

    • 宏任务对性能的影响:由于宏任务相对比较耗时,过多的宏任务或者长时间运行的宏任务可能会导致页面的延迟和卡顿。例如,一个复杂的setInterval定时器在每次执行回调函数时进行大量的计算或者DOM操作,可能会占用较长的时间,使得后续的任务(包括渲染任务)被延迟。特别是当宏任务中包含I/O操作(如网络请求)时,等待响应的时间可能会不确定,这也会影响整个应用的响应性能。
    • 微任务对性能的影响:微任务通常用于处理一些对及时性要求较高的操作,它们的执行相对比较快速。但是,如果微任务队列中的任务过多或者某个微任务执行时间过长,也可能会阻塞下一个宏任务的执行,从而影响到整个事件循环的节奏。不过,由于微任务本身是在宏任务间隙执行的,所以在合理使用的情况下,它们可以帮助我们在不阻塞主要任务流程的情况下及时处理一些小的、重要的操作,如更新UI状态等。
    • 应用行为方面的差异:在应用行为上,宏任务更适合用于处理一些可以延迟执行或者周期性执行的任务,如定时更新数据、延迟加载资源等。而微任务则常用于在异步操作完成后立即进行一些后续处理,并且这些处理通常与当前的执行上下文紧密相关,如在Promise成功或失败后立即进行相应的状态更新或者错误处理。例如,在一个基于Promise的异步数据加载应用中,使用微任务来更新UI显示加载成功的数据,能够确保在数据加载完成后及时、同步地更新界面,提供更好的用户体验。
相关文章
|
存储 Prometheus 监控
评估系统的可用性时间
评估系统可用性时间是指对系统在预定时间内正常运行的能力进行测量和分析,以确保其稳定性和可靠性满足用户需求。这通常涉及对系统故障率、恢复时间和维护周期的综合考量。
|
前端开发 JavaScript UED
前端知识笔记(十)———宏任务和微任务
前端知识笔记(十)———宏任务和微任务
1475 0
|
11月前
|
前端开发 JavaScript 开发者
前端 CSS 优化:提升页面美学与性能
前端CSS优化旨在提升页面美学与性能。通过简化选择器(如避免复杂后代选择器、减少通用选择器使用)、合并样式表、合理组织媒体查询,可减少浏览器计算成本和HTTP请求。利用硬件加速和优化动画帧率,确保动画流畅。定期清理冗余代码并使用缩写属性,进一步精简代码。这些策略不仅加快页面加载和渲染速度,还提升了视觉效果,为用户带来更优质的浏览体验。
|
12月前
|
人工智能 分布式计算 大数据
MaxFrame 产品评测
MaxFrame 是一款连接大数据和 AI 的 Python 分布式计算框架。本文介绍了其在实际使用中的表现,包括便捷的安装配置、强大的分布式 Pandas 处理能力和高效的大语言模型数据处理。文章还对比了 MaxFrame 与 Apache Spark 和 Dask 的优劣,并提出了未来发展的建议,旨在为读者提供全面的评测参考。
278 22
|
11月前
|
存储 文字识别 Serverless
阿里云多模态数据信息提取解决方案评测
本评测涵盖阿里云多模态数据信息提取解决方案的部署操作界面、文档、函数应用模板、官方示例验证及信息提取方案的实用性与可移植性。界面简洁但部分参数解释不足;文档逻辑清晰,特殊权限配置说明有限;模板简化部署,自定义扩展指导欠缺;官方示例基本功能齐全,复杂场景验证不足;信息提取方案实用性强,但跨平台兼容性需改进。总体表现良好,细节优化空间大。
|
12月前
|
SQL 人工智能 分布式计算
MaxFrame 产品深度评测
本文全面评测了 MaxFrame,这款新兴的 Python 分布式计算框架,涵盖其在分布式 Pandas 处理、大语言模型数据处理等方面的优势。通过实际案例和用户体验,展示了 MaxFrame 在企业业务和个人学习中的重要作用,并与其他工具进行了对比,指出了其优点和改进空间。
|
人工智能 前端开发 算法
主动式智能导购 AI 助手构建方案评测
《主动式智能导购 AI 助手构建方案评测》详细评估了该方案在部署体验、技术原理理解及生产环境应用指导等方面的表现。方案在智能导购领域展现出一定潜力,但文档的详细程度和技术细节的阐述仍有改进空间,特别是在复杂操作和高级功能的指导上。总体而言,该方案具备优势,但需进一步优化以更好地满足企业需求。
258 10
|
弹性计算 运维 网络安全
阿里云云服务诊断工具评测报告
作为一名运维工程师,我日常负责云资源的运维和管理。阿里云的云服务诊断工具是我工作中的得力助手,尤其在健康状态和诊断功能方面表现出色。健康状态功能实时展示云资源的关键指标,帮助我提前发现并解决性能瓶颈;诊断功能则能迅速定位并解决各类复杂问题,显著提升工作效率。然而,该工具在面对新兴云服务架构和混合云环境时仍存在一定局限,建议进一步扩展监测指标和增强兼容性诊断能力,以提供更全面的支持。
|
12月前
|
人工智能 前端开发 算法
《关于 <主动式智能导购 AI 助手构建> 解决方案的深度评测》
随着电商行业的蓬勃发展,智能导购助手的重要性日益凸显。本文深入体验并部署了《主动式智能导购 AI 助手构建》解决方案,从部署体验、实践原理、架构设计、百炼大模型应用及生产环境适配性等多个方面进行了全面评测。尽管在数据导入和代码逻辑等方面存在一些挑战,但该方案在智能导购领域展现出较大潜力,未来有望通过进一步优化和完善,更好地满足企业的实际需求。
281 3
|
12月前
|
运维 数据可视化 云计算
阿里云云服务诊断工具评测
作为一名资深的运维工程师,我在云计算领域积累了丰富的经验。阿里云云服务诊断工具的出现,极大地提升了我的工作效率。健康状态功能让我能够实时监控云资源的变化,及时发现并预防潜在问题。诊断功能则能快速定位故障根源,提供详尽的解决方案。然而,工具在面对复杂云原生架构和特定行业场景时仍有改进空间。我建议完善容器化和微服务架构的监测指标,引入人工智能优化诊断结果,简化操作界面,以进一步提升工具的实用性和用户体验。
164 4