首页 > 其他分享 >事件循环如何处理微任务和宏任务

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

时间:2024-09-21 17:14:50浏览次数:1  
标签:console log 队列 任务 循环 事件 settimeout

在 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 回调)比宏任务具有更高的优先级并且执行得更快。以上就是事件循环如何处理微任务和宏任务的详细内容,更多请关注我的其它相关文章!

标签:console,log,队列,任务,循环,事件,settimeout
From: https://www.cnblogs.com/aow054/p/18424244

相关文章

  • UI 阻塞行为:微任务与宏任务
    你能找出下面两个代码片段的区别吗:functionhandleclick1(){settimeout(handleclick1,0);}functionhandleclick2(){promise.resolve().then(handleclick2);}登录后复制如果您无法确定选择其中一个的含义,那么这篇博文将教您一些新知识。背景settimeout用于安......
  • 1.JDK自带的线程池有哪些?2.线程池中核心线程数与最大线程数与缓冲任务队列的关系?3.为
    1.JDK自带的线程池有哪些?2.线程池中核心线程数与最大线程数与缓冲任务队列的关系?在Java中的线程池(如ThreadPoolExecutor)中,核心线程数(corePoolSize)、最大线程数(maximumPoolSize)以及缓冲队列(workQueue)之间存在着密切的关系,它们共同决定了线程池如何管理和调度任务。以下是......
  • for循环—不同div显示不同样式
    for出来的div想要显示不同的样式,可以通过动态class,根据需要的条件指示控制样式,例如用index第一个div显示first-card的样式,第二个div显示second-card的样式<divclass="meal"><el-cardclass="meal_details"v-for="(item,index)inm......
  • 排查帝国CMS定时刷新任务失效问题,快速解决!
    当帝国CMS的定时刷新任务失效时,可以通过以下几个方面来进行排查和解决:1.检查计划任务设置访问计划任务页面:登录帝国CMS后台管理系统,进入“系统”->“计划任务”页面。确认任务设置:确保定时刷新任务已经正确设置,包括触发时间、执行频率等参数。2.校验服务器时间检查服务......
  • DataX--Web:图形化界面简化大数据任务管理
            在处理大数据任务时,频繁地修改配置文件或编写脚本可能会变得繁琐且容易出错。DataXWeb提供了一个图形化界面,旨在简化这些操作,让用户通过直观的界面管理数据同步任务。DataXWeb简介        DataXWeb是一个开源项目,它允许用户通过Web界面来配置和管......
  • 直播短视频源码,延迟任务的解决方法
    直播短视频源码,延迟任务的解决方法在直播短视频源码中,我们有时候会遇到这样的场景,比如下单之后超过30分钟未支付自动取消订单,还有就比如过期/生效通知等等,这些场景一般有两种方法解决:第一种可以通过定时任务扫描符合条件的去执行;第二种就是提前通过消息队列发送延迟消息到期自......
  • JavaScript(输出1-100,输出1-100总和,输出1-100的偶数,奇数和 用while循环和for循环两种方
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title><......
  • Linux: while read 循环丢失最后一行的问题及解决方案
    在Linux的Shell编程中,使用whileread循环来逐行读取文件内容是一种常见的操作。然而,许多人在使用whileread时会遇到一个问题:文件的最后一行可能不会被读取,尤其是当最后一行没有换行符时。这里将探讨这个问题的原因,并提供相应的解决方案。问题概述在Bash中,read......
  • jsDoc npm 模块任务
    目前我正在工作/维护遗留的js/react应用程序,没有办法重新工作到typesript,这就是为什么我打开jsdoc作为js现有的开发时类型系统。太长了;typescriptnpm模块由jsdoc制作,useduck在70loc下带回了redux的黄金时代。该模块在开发时的主要用例,帮助您的复杂状态保持......
  • JavaScript 中的异步循环:forof 与 forEach
    javascript的异步功能非常酷?,但是选择正确的循环来处理这些异步任务可能会产生很大的不同。让我们用一点乐趣来分解for...of和foreach之间的区别?1。带有异步函数的for...of循环将for...of循环想象为您超级勤奋的朋友,他耐心地等待您完成一项任务,然后再开始下一项任务。......