首页 > 其他分享 >微任务和宏任务之间的优先级

微任务和宏任务之间的优先级

时间:2024-06-19 13:32:14浏览次数:25  
标签:优先 优先级 队列 一个 任务 之间 执行 First

微任务和宏任务的优先级关系

微任务优先宏任务

事件循环

JavaScript 是一种单线程语言,这意味着它一次只能执行一个任务。事件循环是管理这些任务的机制,它包含以下几个重要步骤:

  1. 执行全局代码:当一个脚本加载和执行时,全局代码首先执行。
  2. 执行栈(Call Stack):这是一个 LIFO(Last In, First Out)结构,当前正在执行的任务总是位于栈顶。
  3. 任务队列(Task Queue):这是一个 FIFO(First In, First Out)结构,包含即将要执行的任务。
微任务和宏任务
宏任务(Macrotasks):这些包括诸如 setTimeout, setInterval, setImmediate, I/O 操作和 UI 渲染等。
微任务(Microtasks):这些通常由 Promise 回调、MutationObserver 和 process.nextTick(在 Node.js 中)产生。
执行顺序
  1. 优先执行一个宏任务
  2. 判断是否有微任务(无:继续执行宏任务)
  3. 有:执行所有的微任务
  4. 开始下一个宏任务

为什么微任务优先于宏任务?

当一个宏任务执行完毕后,JavaScript 引擎会立即检查微任务队列,并执行所有微任务。微任务队列为空后,引擎才会继续执行下一个宏任务。这种机制的原因包括以下几个方面:

  1. 提高响应速度微任务通常是处理细粒度的异步操作,如 Promise 回调。优先处理微任务可以使得应用对用户交互和数据变化做出更快的响应,从而提升用户体验。
  2. 保持状态一致性:在执行微任务时,保证了所有相关的异步操作在同一个宏任务执行周期内完成。这有助于在执行下一个宏任务之前,确保应用状态的一致性和数据的完整性。
  3. 防止饿死(Starvation):由于微任务优先于宏任务,所以即使微任务不断产生(例如在一个微任务中不断创建新的微任务),宏任务依然能够在微任务队列处理完毕后得到执行,避免了可能的宏任务饿死问题。

标签:优先,优先级,队列,一个,任务,之间,执行,First
From: https://blog.csdn.net/m0_63779901/article/details/130041130

相关文章

  • 异步任务取消、超时
    一、定义异步任务//定义异步任务publicclassAsyncClass{publicstaticasyncTaskTaskAsync(CancellationTokentoken){token.Register(()=>{Console.WriteLine("TaskAsync被取消");});for(inti=0;i<10;i++){......
  • matlab有向网络节点之间最短路经计算
      clc;clear;%定义边列表(源节点,目标节点,权重)w1=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];s1=[1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3,3,4,5,6,7,7,8,9,10,10,10,11,11,11,12,13,14,14,15,15,15,16,17,18,......
  • Jenkins教程-3-github自动化测试任务构建
    上一小节我们学习了Jenkins在windows和mac系统上安装搭建环境的方法,本小节我们讲解一下Jenkins构建github自动化测试任务的方法。接下来我们以windows系统为例,讲解一下构建实际自动化测试任务的具体步骤。安装git和github插件点击进入Jenkins插件管理页面安装如下插件......
  • 多租户的后台管理系统框架涉及到在不同租户之间隔离数据(字段隔离)------------升鲜宝供
    在多租户系统中,为了区分平台级用户和租户级用户,我们通常会使用一个特定的租户ID来表示平台级用户和角色。这种设计确保了平台级用户和角色能够被正确识别和管理,而不会与任何具体租户的用户和角色混淆。###设计方案1.**特定租户ID**:使用一个特定的租户ID(例如,`0`或`1`)来表......
  • 深入探究RTOS的任务调度
    阅读引言:此文将会从一个工程文件,一步一步的分析RTOS的任务调度实现,这里选用FreeRTOS分析,别的也差不多的,可能在细节上有少许不一样。目录1,常见嵌入式实时操作系统2,任务调度的本质3,任务调度分析开始1,常见嵌入式实时操作系统操作系统名称特点许可类型适用......
  • 项目运维时,某用户通过RDP远程桌面连接服务器...任务管理器显示用户状态断开连接!记录运
    目录问题出现解决方式测试参考  今天处理项目运维问题,发现服务器任务管理器出现用户状态断开连接......问题出现项目运维时,某用户通过rdp远程桌面连接Windowsserver服务器时,出现服务器发布的进度计划无法执行,打开服务器任务管理界面出现用户状态断开连接标志,如下......
  • 21、docker-网络连通-两个不同网络之间的连通
     语法  测试:dockernetworkconnectmynettomcat-net-01//这里tomcat-net-01容器用的是默认的网络、通过connect连接到了自定义的网络mynet查看mynet网络·连通之后就是将tomcat-net-01放到了mynet网络下 连通之后就可以互相ping通了......
  • 12、docker-数据卷容器-多个容器之间数据同步----volumes-from
     =========================================================================================测试:让docker02和03继承docker01·三个容器中,如果父容器被删除了,02和03的数据还是会存在的·容器共享的只有做了特殊处理的卷,不是所有的文件都共享,比如下列的volume01和......
  • 面向对象程序设计1.2 类之间的组合关系
    一、复习一下在1.1里我们定义了类Date,忘记的小伙伴可以看看下面的代码classDate{private:intyear;intmonth;intday;//数据成员,默认为私有public:Date():year(2000),month(1),day(1){}//不带参数的构造函数Date(intyear,intmonth,in......
  • FreeRTOS简单内核实现6 优先级
    0、思考与回答0.1、思考一如何实现RTOS内核支持多优先级?因为不支持优先级,所以所有的任务都插入了一个名为pxReadyTasksLists的就绪链表中,相当于所有任务的优先级都是一致的,那如果我们创建一个就绪链表数组,数组下标代表优先级,优先级为x的任务就插入到pxReadyTasksLists[x......