事件循环如何处理微任务和宏任务

事件循环如何处理微任务和宏任务

在 javascript 中,微任务和宏任务是事件循环管理的两种类型的异步任务,但它们的处理方式不同。了解它们的工作原理对于预测异步代码的执行顺序至关重要。

1.宏任务队列(任务队列)

宏任务被放入自己的队列中,通常称为任务队列或宏任务队列。宏任务的示例包括:settimeout、setinterval、i/o 事件和 dom 事件(如单击和加载)。事件循环会从此队列中获取每个宏任务来执行,但前提是微任务队列中的所有微任务都已处理完毕。

2. 微任务队列

微任务有自己的队列,称为微任务队列。微任务的例子包括:promise 的 .then()、mutationobserver。微任务队列的优先级高于宏任务队列。每个宏任务执行后,事件循环将处理该队列中的所有微任务,然后再继续执行下一个宏任务。

事件循环如何处理微任务和宏任务:

事件循环开始新的循环。执行调用堆栈中的所有同步代码。当调用堆栈为空时执行微任务队列中的所有微任务。如果一个微任务添加了更多的微任务,它们将在同一个周期内立即执行。移动到宏任务队列中的第一个宏任务并执行它。重复此过程。

示例:

console.log('start');settimeout(() => {  console.log('macrotask 1');  promise.resolve().then(() => {    console.log('microtask inside macrotask 1');  });}, 0);settimeout(() => {  console.log('macrotask 2');}, 0);console.log('end');

输出

StartEndMicrotask 1Microtask 2Macrotask 1Macrotask 2

解释:

console.log(‘start’): 立即执行并打印“start”。settimeout(…, 0) (macrotask 1): 添加到宏任务队列。promise.resolve().then(…)(微任务1):添加到微任务队列。settimeout(…, 0) (宏任务 2):添加到宏任务队列中。promise.resolve().then(…)(微任务 2):添加到微任务队列。console.log(‘end’):立即执行并打印“end”。微任务:事件循环将在处理任何宏任务之前处理微任务队列中的所有微任务:打印“微任务 1”。打印“微任务 2”。宏任务:执行第一个 settimeout(…, 0)(宏任务 1),打印“macrotask 1”。执行第二个 settimeout(…, 0)(宏任务 2),打印“macrotask 2”。

概括:

微任务和宏任务被放入两个独立的队列中:微任务队列和宏任务队列。在事件循环中,微任务队列先于宏任务队列进行处理。在每个宏任务之后,事件循环会处理微任务队列中的所有微任务,然后再移至宏任务队列中的下一个宏任务。这确保了微任务(例如 promise 回调)比宏任务具有更高的优先级并且执行得更快。

以上就是事件循环如何处理微任务和宏任务的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1491474.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 13:59:40
下一篇 2025年12月11日 07:32:47

相关推荐

  • 了解现代 Web 开发中的 chunkjs:代码分割和性能优化指南

    在 Web 开发中,尤其是使用 React、Vue 或 Angular 等现代 JavaScript 框架时,chunk.js 指的是在应用程序的构建过程中创建的 JavaScript 捆绑文件。 当捆绑或编译 Web 应用程序时,Webpack 或 Vite 等构建工具会将 JavaScript …

    2025年12月19日
    000
  • 你能解决这个问题吗?

    假设我们有两个 div,一个内部 div 和另一个外部 div。 内部 div 负责缩放和平移(使用 css 变换、平移和缩放完成)。 现在可以通过拖放将新的 div 添加到内部 div 中。放置事件被outerdiv 接受 现在,在放置事件期间,您可以获得 clientx、clienty 位置,现…

    2025年12月19日
    000
  • JavaScript 数组方法:综合指南

    数组是 javascript 中最基本的数据结构之一。使用数组,您可以在单个变量中存储多个值。 javascript 提供了许多内置方法来操作数组,使它们具有令人难以置信的通用性。在这篇文章中,我们将探讨所有内置数组方法以及如何在 javascript 项目中有效地使用它们。 核心方法 foreac…

    2025年12月19日
    000
  • Web Development Job in 4

    简介 网络开发领域持续快速发展,为拥有适当技能和知识的个人提供了令人兴奋的机会。如果您想进入这个充满活力的行业或提升自己的职业生涯,这里有一些重要策略可以帮助您在 2024 年找到梦想的工作: 1. 掌握基本技能 编程语言:熟练掌握 JavaScript、Python、Ruby 或 PHP 等语言至…

    2025年12月19日
    000
  • 管理速率限制

    在当今的互联世界中,应用程序通常必须对外部服务进行数十万次 API 调用,对此类请求的有效管理至关重要。为防止滥用或过度使用资源而采用的最多产的技术之一是速率限制 – 限制客户端在给定时间段内可能发出的请求数量。虽然速率限制可以提高服务的稳定性,但这对于开发人员来说通常是一个挑战,他们必…

    2025年12月19日
    000
  • JavaScript 中的高阶函数

    什么是高阶函数? 高阶函数是可以接受其他函数作为参数或返回函数作为值的函数。它们为我们提供了一种强大的方法来编写可应用于各种场景的可重用代码。 javascript 有几个常用的高阶函数,包括map()、filter() 和reduce()。由于存在高阶函数,javascript 通常被称为函数式编…

    2025年12月19日
    000
  • 为什么 Streams API 改变了 Web 开发者的游戏规则

    我们首先解释一下数据是如何通过网络发送的。它不是作为单个连续流发送的;相反,它被分成更小的块。在接收端,消费者或应用程序负责在收到所有数据后以正确的顺序和格式重新组装这些块。对于图像、视频和其他相对较大的数据类型,此过程会自动发生。 因此 streams api 提供的是一种无需等待完整数据可用的方…

    2025年12月19日
    000
  • 学习如何:useEFFECT 和 useSTATE,一个 REACT 应用程序

    我一直在开发一个名为“Heat”的网络应用程序,该应用程序的唯一目的是帮助我学习和应用 JavaScript 并改进我的 CSS,还有很多后端。我们的计划是创建一个具有视觉吸引力的网络应用程序,并具有一些有趣的功能。 在这个过程中我学到了什么: 前端是使用react js构建的,我选择react只是…

    2025年12月19日
    000
  • Bunjs 与 PM2

    动机 我正在使用 Bunjs 作为我的多人海战游戏 Sunbaked 的后端。 现在,我想让我的服务器在抛出服务器中断错误时自动重新启动。我通读了关于如何将 PM2 与 Bunjs 一起使用的官方指南,但发现它遗漏了一小段信息…… $bun install -g pm2 文章…

    2025年12月19日
    000
  • Auth、OAuth 和 Auth 什么是?

    破解认证难题:幸存者和学习者的故事 哦,这会是另一本 OAuth 指南吗?一点也不!这将更像什么是什么会话?所以,你知道你要处理什么。 Auth、OAuth、Auth0……这些你已经看过、听过100遍的术语,它们是什么意思? 好吧,伙计!如果我们已经消除了对我们将要讨论的内容的困惑,那么让我们系好安…

    2025年12月19日
    000
  • 保护 JavaScript 应用程序的安全:常见漏洞以及如何避免它们

    javascript 是最流行的 web 开发语言之一,但由于其广泛使用,它也是攻击者的常见目标。保护 javascript 应用程序的安全对于避免可能导致数据被盗、用户帐户受损等安全漏洞至关重要。本文将探讨 javascript 应用程序中的一些常见漏洞并提供缓解这些漏洞的策略。 常见 javas…

    2025年12月19日
    000
  • 太阳能系统挑战

    这是前端挑战 v24.09.04 的提交,Glam Up My Markup: Space 我建造了什么 我使用 CSS 网格创建了一个登陆页面,展示了每个部分中的所有项目。 演示 斯蒂芬妮-丹尼希.github.io 旅行 这是我完成的第一个这样的挑战。我想测试我的技能,看看在没有设计文件作为指导…

    2025年12月19日
    000
  • 具有 Webnd AMM 机器人经验的区块链开发人员

    概述:Emerline 正在寻找一位技术精湛的区块链开发人员,他们在 Web3 领域拥有强大的背景,并且在自动做市 (AMM) 机器人方面拥有专业知识。我们正在开发一个用于加密货币交易的去中心化交易所 (DEX) 平台,AMM 功能是我们项目的核心目标。 理想的候选人将具备: 深入了解区块链技术:深…

    2025年12月19日
    000
  • 如何在 TypeScript 中创建一个类型来检索对象的所有键

    typescript 有一个名为 keyof 的功能,可用于获取对象的键。然而,keyof 运算符仅适用于对象的第一层,当我们想要获取深层的所有键时,事情会变得有点复杂。在这篇文章中,我们将讨论如何实现一个可以深层获取所有键的类型。 问题概述 为了理解我们要解决的问题,让我们从一个例子开始。考虑以下…

    2025年12月19日
    000
  • 进步

    您好,我叫 Jean Cleno,目前居住在荷兰。我是海地安的列斯人(出生于圣马丁岛,家庭背景在海地)。我的目标是建立两家成功的 SaaS 企业,经营一家月收入六位数的网页设计机构,并担任前端工程师,最终成为一名高级开发人员 10 年。本质上,我计划从一名非熟练员工发展为一名熟练员工,然后成为一名自…

    2025年12月19日
    000
  • 处理问题

    我制作了explainer.js,一个用于处理文件并输出代码块和解释的 CLI 工具。如果您不知道文件中发生了什么,那么这可能会有所帮助。使用 Commander.js 和 Groq SDK 构建!看看@ https://github.com/aamfahim/explainer.js 即时响应 为…

    2025年12月19日
    000
  • 多语言解决了大部分训练 XSS 肌肉挑战

    `74k<k 是插入任意标签的技巧,其中 74 是 < 的八进制表示形式。这可以绕过通过将 < 转换为八进制实体来清理的过滤器。k 是任意标签(可以是任何字符),具有 contenteditable、a​​utofocus 和 onfocus 属性。焦点=/**/{(alert)(…

    2025年12月19日
    000
  • React Native 最佳实践

    如果您是 react native 开发者初学者,或者有经验,那么您必须意识到代码实践是一项不容妥协的技能。作为开发人员,项目的交付是必须的,但编写可扩展且高质量的代码将对您和您的团队的未来有所帮助。 在我们继续之前,这些实践可以在 react native cli 或 expo 项目上使用。从 2…

    2025年12月19日
    000
  • 了解 React 应用程序中的渲染和重新渲染:它们如何工作以及如何优化它们

    当我们在 react 中创建应用程序时,我们经常会遇到术语“渲染”和“重新渲染组件”。虽然乍一看这似乎很简单,但当涉及不同的状态管理系统(如 usestate、redux)或当我们插入生命周期钩子(如 useeffect)时,事情会变得有趣。如果您希望您的应用程序快速高效,那么了解这些流程是关键。 …

    2025年12月19日
    000
  • JavaScript 中的 SET(初学者教程)

    你好, 您是否正在寻找一种存储唯一值、允许插入值、查找值总数和删除值的数据结构?套装是最佳选择。许多编程语言都包含内置的 set 数据结构,javascript 也不例外。让我们更深入地了解集合的工作原理。 设置是什么? ​​set 是一种数据结构,可让您存储任何类型的唯一值,无论是原始值还是对象引…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信