浏览器执行机制

主线程 \rightarrow任务1,任务2 \rightarrow \rightarrow
微队列微队列任务1, 微队列任务2
延时队列延时队列任务1, 延时队列任务2
交互队列....

事件循环的工作原理

  1. 主线程执行同步任务

    • 主线程首先执行所有同步任务(即栈中的任务)。这些任务会按顺序执行,直到没有更多同步任务为止。
  2. 遇到微任务或宏任务

    • 在执行同步任务时,如果遇到异步任务(例如 PromisesetTimeout 等),这些异步任务会被添加到相应的队列中。具体来说:
      • 微任务(Microtask):如 Promise.then()MutationObserver 等会被加入到微任务队列中。
      • 宏任务(Macrotask):如 setTimeoutsetIntervalI/O 操作等会被加入到宏任务队列中。
  3. 执行微任务队列

    • 当主线程的同步任务执行完毕后,微任务队列会被立即执行,直到微任务队列为空。微任务的优先级高于宏任务,所以它们会在每个事件循环中尽可能多地执行。
    • 如果微任务中又生成了新的微任务,这些新的微任务会在当前事件循环中继续执行,直到微任务队列清空。
  4. 执行宏任务队列(延时队列和交互队列)

    • 当微任务队列为空时,主线程会从宏任务队列中取出任务执行。宏任务队列中的任务是按照加入的顺序依次执行的。
      • 延时队列:由 setTimeoutsetInterval 等产生的任务。
      • 交互队列:用户交互事件(如 clickscroll 等)会被放入交互队列。
    • 在执行宏任务时,如果遇到新的微任务,它们会被添加到微任务队列中,待下一轮微任务执行时处理。
  5. 重复事件循环

    • 事件循环会不断重复,先执行主线程中的同步任务,然后处理微任务队列,接着处理宏任务队列。每次事件循环都会清空微任务队列后才会执行宏任务。

事件循环的顺序总结

  1. 执行主线程中的同步任务
  2. 执行微任务队列中的任务(微任务优先级高于宏任务)。
  3. 执行宏任务队列中的任务(按照加入顺序)。
    • 在宏任务执行过程中,如果遇到新的微任务,它们会被添加到微任务队列中,等微任务队列为空时再执行。
  4. 继续下一轮事件循环,重复上述过程。

练习:

console.log(1)setTimeout(() => {console.log(2)
}, 0)const promise = new Promise((resolve, reject) => {console.log(3)setTimeout(() => {new Promise((resolve, reject) => {resolve('success')console.log(8)}).then(data => {console.log(10)})console.log(4)}, 0)resolve('success')
})setTimeout(() => {console.log(5)
}, 0)console.log(6)promise.then(data => {console.log(7)
})console.log(9)

答案:

1
3
6
9
7
2
8
4
10
5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/889890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 基础知识——part 4

8.成员方法:Java中必须通过方法才能对类和对象的属性操作;成员方法只在类的内部声明并加以实现。一般声明成员变量后再声明方法。 9.方法定义 方法的返回值是向外界输出的信息,方法类型和返回值类型同;返回值通过return返回&…

设计模式12:抽象工厂模式

系列总链接:《大话设计模式》学习记录_net 大话设计-CSDN博客 参考: C设计模式:抽象工厂模式(风格切换案例)_c 抽象工厂-CSDN博客 1.概念 抽象工厂模式(Abstract Factory Pattern)是软件设计…

【YashanDB知识库】kettle同步大表提示java内存溢出

【问题分类】数据导入导出 【关键字】数据同步,kettle,数据迁移,java内存溢出 【问题描述】kettle同步大表提示ERROR:could not create the java virtual machine! 【问题原因分析】java内存溢出 【解决/规避方法】 ①增加JV…

适配体技术在新药发现中的应用

适配体筛选技术在新药发现中的具体应用 适配体筛选技术,特别是SELEX(Systematic Evolution of Ligands by Exponential Enrichment,指数富集的配体系统进化技术),在新药发现中扮演着至关重要的角色。这种技术能够从庞…

C/S软件授权注册系统(Winform+WebApi+.NET8+EFCore版)

适用软件:C/S系统、Winform桌面应用软件。 运行平台:Windows .NETCore,.NET8 开发工具:Visual Studio 2022,C#语言 数据库:Microsoft SQLServer 2012,Oracle 21c,MySQL8&#xf…

go语言使用websocket发送一条消息A,持续接收返回的消息

在Go语言中实现一个WebSocket客户端,可以使用gorilla/websocket这个非常流行的库来处理WebSocket连接。下面是一个简单的示例,展示了如何创建一个WebSocket客户端,向服务器发送消息"A",并持续接收来自服务器的响应。 首…

监控易 IDC 数据中心一体化智能运维平台:新质生产力的典范

一、引言 在当今数字化飞速发展的时代,IDC 数据中心作为信息产业的核心基础设施,其稳定、高效运行对于企业和社会的重要性不言而喻。随着数据量的爆炸式增长和业务复杂度的提升,传统的运维模式已难以满足需求,数据中心面临着诸多挑…

活着就好20241218

亲爱的朋友们,大家早上好!🌞 今天是18号,星期三,2024年12月的第十八天,同时也是第50周的第九天,农历甲辰[龙]年十一月初十四日。在这晨光初照的美丽时刻,愿那温柔而灿烂的阳光轻轻洒…

busybox学习——简单介绍

文章目录 简介官网源码目录结构构建 简介 BusyBox 将许多具有共性的小版本的UNIX工具结合到一个单一的可执行文件。这样的集合可以替代大部分常用工具比如的GNU fileutils , shellutils等工具,BusyBox提供了一个比较完善的环境,可以适用于任…

C++常见面试题-初级2

1. C和C有什么区别? C是面向对象的语言,而C是面向过程的语言;C引入new/delete运算符,取代了C中的malloc/free库函数;C引入引用的概念,而C中没有;C引入类的概念,而C中没有&#xff1…

Unity UI Button 事件优先级调整技术方案

Unity UI Button 事件优先级调整技术方案 在 Unity 项目开发过程中,针对 UI Button 的事件执行顺序控制是一个常见需求。本文详细阐述两种将新添加事件置于第一个执行位置的方法,旨在为开发者提供全面且专业的技术参考。 一、基于反射机制的事件插入方…

CTFHUB 信息泄露 备份文件下载-网站源码

根据提示应是猜测网站源码的备份文件,可以采用bp拼接文件名和后缀 开启bp抓包后设置第一个攻击点导入文件名 第二个攻击点导入后缀 开始暴力破解,有成功响应的 拼接到网站后缀后可以直接下载 解压缩后记事本的名字就是flag 总结: …

Latex 转换为 Word(使用GrindEQ )(英文转中文,毕业论文)

效果预览 第一步: 告诉chatgpt: 将latex格式中的英文翻译为中文(符号和公式不要动),给出latex格式第二步: Latex 转换为 Word(使用GrindEQ ) 视频 https://www.bilibili.com/video/BV1f242…

X射线衍射全岩分析在岩石学研究中的重要性

X射线衍射全岩分析在岩石学研究中的重要性 X射线衍射(XRD)全岩分析在岩石学研究中扮演着至关重要的角色,它是一种非破坏性的分析技术,能够提供岩石和矿物的精细结构信息。通过解析材料内部原子排列的特征,XRD不仅揭示了…

12.12 深度学习-卷积的注意力机制-通道注意力SENet

# 告诉模型训练的时候 对某个东西 给予额外的注意 额外的权重参数 分配注意力 # 不重要的就抑制 降低权重参数 比如有些项目颜色重要 有些是形状重要 # 通道注意力 一般都要比较多的通道加注意力 # SENet # 把上层的特征图 自动卷积为 1X1的通道数不变的特征图 然后给每一个…

使用 Python 从 ROS Bag 中提取图像:详解与实现

在机器人应用中,ROS (Robot Operating System) 是一个常见的框架。ROS Bag(rosbag)是 ROS 中用于记录和回放数据流(例如传感器数据、话题消息等)的一种强大工具。有时,我们需要将存储在 rosbag 文件中的图像…

【Bolt.new + PromptCoder】三分钟还原油管主页

【Bolt.new PromptCoder】三分钟还原油管主页 PromptCoder官网:PromptCoder Bolt官网:https://bolt.new/ Bolt 是什么? Bolt.new 是一个提供创建全栈网络应用服务的平台。它允许用户通过提示(Prompt)、运行&#x…

【小白你好】深度学习的认识和应用:CNN、GNN、LSTM、Transformer、GAN与DRL的对比分析

大家好!今天我们来聊聊一个热门话题——深度学习。别担心,我会用简单易懂的语言,让每个人都能理解。我们将一起探索什么是深度学习,它有哪些类似的概念,以及其中几种主要的算法:卷积神经网络(CN…

定时/延时任务-万字解析Spring定时任务原理

文章目录 1. 概要2. EnableScheduling 注解3. Scheduled 注解4. postProcessAfterInitialization 解析4.1 createRunnable 5. 任务 Task 和子类6. ScheduledTaskRegistrar6.1 添加任务的逻辑6.2 调度器初始化6.3 调用时机 7. taskScheduler 类型7.1 ConcurrentTaskScheduler7.2…

JumpServer开源堡垒机搭建及使用

目录 一,产品介绍 二,功能介绍 三,系统架构 3.1 应用架构 3.2 组件说明 3.3 逻辑架构 3.3 逻辑架构 四,linux单机部署及方式选择 4.1 操作系统要求(JumpServer-v3系列版本) 4.1.1 数据库 4.1.3创建数据库参考 4.2 在线安装 4.2.1 环境访问 4.3 基于docker容…