热门标签 | 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》


推荐阅读
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
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社区 版权所有