热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浅析JS事宜轮回之Microtask和Macrotask

简介我们在上一篇《浅析JS中的EventLoop事宜轮回》中提到一个EventQueue,其实在事宜轮回中queue一共有两种,另有一种叫JobQueue个中EventQueue在
简介

我们在上一篇 《浅析 JS 中的EventLoop 事宜轮回》 中提到一个 Event Queue,其实在事宜轮回中 queue 一共有两种,另有一种叫 Job Queue

个中

Event Queue 在 HTML 范例中被称为
Task Queue,然则为了辨别,平常都叫作
Macrotask Queue

Job Queue 是在 ECMAScript 范例中谈及处置惩罚 Promise 回调时提到的,然则因为和 V8 中的完成比较类似,所以平常都称为
Microtask Queue

Macrotask

Macrotasks 包括了剖析 HTML、天生 DOM、实行主线程 JS 代码和其他事宜如 页面加载、输入、收集事宜、定时器事宜等。从浏览器的角度,Macrotask 代表的是一些离散的自力的事情。

罕见运用
setTimeout, setInterval, setImmediate, requestAnimationFrame, I/O, UI rendering

Microtask

Microtasks 则是为了完成一些更新运用顺序状况的较小的使命,如处置惩罚 Promise 的回折衷 DOM 的修正,以便让这些使命在浏览器从新衬着之前实行。Microtask 应该以异步的体式格局尽快实行,所以它们的开支比 Macrotask 要小,而且能够使我们在 UI 从新衬着之前实行,避免了不必要的 UI 衬着。

罕见运用
process.nextTick, Promises, Object.observe, MutationObserver

实行递次

Event Loop 的完成须要最少一个 Macrotask Queue 和最少一个 Microtask Queue。为了便于明白,我们都简化成一个。
简朴来讲,Microtask Queue 具有更高的优先级,即实行一个 Macrotask 使命后,就会清空全部 Microtask Queue,此时如果有新的 Microtask 到场也会被实行。

所以我们来看下面的代码:
《浅析 JS 事宜轮回之 Microtask 和 Macrotask》

实行递次是什么?
我们已晓得 setTimeout 是 Macrotask,Promise 是 Microtask,而这段代码从上到下实行也是一个 Macrotask

步骤:

  1. 最先实行,实行剧本作为一个使命进入 Macrotask Queue,同时进入挪用栈实行
  2. Line 1, 输出 script start
  3. Line 3 的 setTimeout 回调进入 Macrotask Queue 守候
  4. Line 7 的回调进入 Microtask Queue 守候
  5. Line 13 输出 script end,此时剧本实行完成(即完成了一个 Macrotask)
  6. 最先实行 Microtask Queue,从中拿出一个放入挪用栈实行
  7. 最先实行 Line 7 的回调,该回调输出 promise1,返回 undefined
  8. Line 9 的回调进入 Microtask Queue,因为 Microtask Queue 没有清空,直接实行该回调,输出 promise2,该回调返回 undefined
  9. Microtask Queue 已清空(此时浏览器能够更新衬着UI),最先将 Macrotask Queue 中使命放入挪用栈实行
  10. 实行 Line 3 的回调,输出 setTimeout,Macrotask Queue 清空
  11. 顺序实行完成

所以打印递次为:

script start -> script end -> promise1 -> promise2 -> setTimeout

PS. 上面的这段代码实行流程,发起看原文的倒数第二篇参考文章,有动态交互操纵能够练习训练。

总结

《浅析 JS 事宜轮回之 Microtask 和 Macrotask》

  1. Microtask 比拟 Macrotask 具有更高的优先级
  2. Macrotask 总是在 JS 代码实行完成而且 Microtask Queue 清空以后实行
  3. JS 代码实行自身也是一个 Macrotask
  4. Microtask Queue 清空后有可能会从新衬着 UI
  5. Promise 属于 Microtask,setTimeout 属于 Macrotask

整体的实行递次为:通例代码 -> promises -> events 和 setTimeout 等

参考文章

原文链接
ECMA262 Job Queues
HTML Standard Task Queue
HTML系列:macrotask和microtask
microtask and macrotask a hands on approach
difference-between-microtask-and-macrotask-within-an-event-loop-context

民众号:码力全开
《浅析 JS 事宜轮回之 Microtask 和 Macrotask》


推荐阅读
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • Java中处理NullPointerException:getStackTrace()方法详解与实例代码 ... [详细]
  • 《精通 jQuery》第六章:深入解析与实战应用
    《精通 jQuery》第六章:深入解析与实战应用本章详细探讨了 Ajax 技术的核心机制及其实际应用。Ajax 通过 XMLHttpRequest 对象实现客户端与服务器之间的异步数据交换,从而在不重新加载整个页面的情况下更新部分内容。这种技术不仅提升了用户体验,还提高了应用的响应速度和效率。此外,本章还介绍了如何利用 jQuery 简化 Ajax 操作,并提供了多个实战案例,帮助读者更好地理解和掌握这一重要技术。 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • Nginx不仅是一款轻量级的高性能Web服务器,还具备出色的负载均衡和反向代理功能。它支持复杂的正则匹配规则、动静内容分离以及灵活的URL重写功能,使得配置和管理更加便捷高效。此外,Nginx提供了多种负载均衡算法,如轮询、加权轮询、最少连接数等,以满足不同应用场景的需求。 ... [详细]
  • Java Web开发中的JSP:三大指令、九大隐式对象与动作标签详解
    在Java Web开发中,JSP(Java Server Pages)是一种重要的技术,用于构建动态网页。本文详细介绍了JSP的三大指令、九大隐式对象以及动作标签。三大指令包括页面指令、包含指令和标签库指令,它们分别用于设置页面属性、引入其他文件和定义自定义标签。九大隐式对象则涵盖了请求、响应、会话、应用上下文等关键组件,为开发者提供了便捷的操作接口。动作标签则通过预定义的动作来简化页面逻辑,提高开发效率。这些内容对于理解和掌握JSP技术具有重要意义。 ... [详细]
  • 深入解析JavaScript中的函数防抖与节流技术及其应用场景
    本文深入探讨了JavaScript中函数防抖和节流技术的原理及应用场景。通过详细的示例代码,全面解析了这两种优化方法在实际开发中的重要作用,为开发者提供了宝贵的参考和实践指导。 ... [详细]
  • 本书详细介绍了在最新Linux 4.0内核环境下进行Java与Linux设备驱动开发的全面指南。内容涵盖设备驱动的基本概念、开发环境的搭建、操作系统对设备驱动的影响以及具体开发步骤和技巧。通过丰富的实例和深入的技术解析,帮助读者掌握设备驱动开发的核心技术和最佳实践。 ... [详细]
  • 使用cpphttplib构建HTTP服务器以处理带有查询参数的URL请求 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • 探索JavaScript倒计时功能的三种高效实现方法及代码示例 ... [详细]
  • 本文提供了 RabbitMQ 3.7 的快速上手指南,详细介绍了环境搭建、生产者和消费者的配置与使用。通过官方教程的指引,读者可以轻松完成初步测试和实践,快速掌握 RabbitMQ 的核心功能和基本操作。 ... [详细]
author-avatar
真知棒
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有