【H2O2 | 软件开发】事件循环机制
目录
前言
开篇语
准备工作
正文
概念
流程
事件队列类型
示例
结束语
前言
开篇语
本系列为短篇,每次讲述少量知识点,无需一次性灌输太多的新知识点。该主题文章主要是围绕前端、全栈开发相关面试常见问题撰写的,希望对诸位有所帮助。
准备工作
概念篇,不对开发环境作要求。
正文
概念
事件循环(Event Loop)是处理异步事件的一种机制,特别是在单线程环境中(如JavaScript在浏览器或Node.js中的运行)。它允许程序在等待异步操作(如I/O操作、定时器、网络请求等)完成时继续执行其他任务,从而避免阻塞主线程。
在JavaScript等语言中,代码通常运行在单线程中,这意味着同一时间只能执行一个任务。为了处理I/O操作、定时器等需要等待的任务(异步任务),程序会将它们交给系统或浏览器处理,而不是阻塞主线程。当异步操作完成后,相关的回调函数会被放入事件队列中,等待执行。事件循环会不断地检查事件队列,如果有任务就取出并执行,直到队列为空(轮询)。
简单来说,事件循环通过将并发任务转化为顺序任务,使用非阻塞的轮询方式,提高了程序的响应性和吞吐量。
流程
事件循环的四个步骤如下——
- 执行同步代码:事件循环首先会执行所有同步代码,直到调用栈为空。
- 检查事件队列:当调用栈清空后,事件处理器会检查事件队列中是否有待处理的任务。
- 执行任务:如果事件队列中有任务,事件处理器会将其取出并执行,直到调用栈再次为空。
- 重复:事件循环会不断重复上述过程,直到所有任务完成。
事件队列类型
在浏览器环境中,事件队列通常分为以下两种:
- 宏任务队列(MacroTask Queue):包括setTimeout、setInterval、异步Ajax操作、I/O操作、用户交互、UI渲染等。
- 微任务队列(MicroTask Queue):包括Promise的回调、MutationObserver等。
setTimeout和setInterval都是ES6计时器中的内容。
常见的Promise的回调函数有then,catch和finally。
MutationObserver是一个用于监视 DOM(文档对象模型)变化的接口,可以监听对 DOM 树的修改(如节点添加、删除、属性更改、文本内容变化等),并在这些变化发生时执行回调函数。
事件循环会优先处理微任务队列中的任务,然后再处理宏任务队列中的任务。
示例
比如,对于下面的代码,它将输出什么结果?
console.log("1");setTimeout(() => {console.log("2");
}, 0);Promise.resolve().then(() => {console.log("3");
});console.log("4");
答案是1432,即先处理同步,再处理异步,而在异步中先处理微任务队列中的任务,再处理宏任务队列中的任务。
特别的,对于用户交互事件,如点击事件来说,则执行顺序还取决于事件发生的顺序。比如如果在计时器时间节点到来前点击,则会先输出用户点击事件的输出结果,反之同理。
结束语
本期内容到此结束。关于本系列的其他博客,可以查看我的面试题专栏。
本系列的博客主要是记录学习经历,并总结阶段的知识点。全篇的操作过程由笔者完成并核验,在部分定义上有参考其他的内容。希望这对您有所帮助,并真心地祝您早日找到心仪的工作岗位。
==期待与你在下一期博客中再次相遇==
——分解的【H2O2】
相关文章:
【H2O2 | 软件开发】事件循环机制
目录 前言 开篇语 准备工作 正文 概念 流程 事件队列类型 示例 结束语 前言 开篇语 本系列为短篇,每次讲述少量知识点,无需一次性灌输太多的新知识点。该主题文章主要是围绕前端、全栈开发相关面试常见问题撰写的,希望对诸位有所帮…...
LVTTL(Low Voltage Transistor-Transistor Logic)电平详解
一、LVTTL电平的定义与核心特性 LVTTL(低压晶体管-晶体管逻辑)是传统TTL(5V)的低电压版本,工作电压通常为3.3V,旨在降低功耗并适配现代低电压集成电路,同时保持与TTL的逻辑兼容性。其核心特点如…...
Manus:成为AI Agent领域的标杆
一、引言 官网:Manus 随着人工智能技术的飞速发展,AI Agent(智能体)作为人工智能领域的重要分支,正逐渐从概念走向现实,并在各行各业展现出巨大的应用潜力。在众多AI Agent产品中,Manus以其独…...
批量测试IP和域名联通性
最近需要测试IP和域名的联通性,因数量很多,单个ping占用时间较长。考虑使用Python和Bat解决。考虑到依托的环境,Bat可以在Windows直接运行。所以直接Bat处理。 方法1 echo off for /f %%i in (E:\封禁IP\ipall.txt) do (ping %%i -n 1 &…...
网络安全之tcpdump工具
引言 wireshark是一款非常不错的抓包软件,在图形化界面占绝对统治地位;尽管其在字符界面下有些许选项可供使用,但终究不太方便,下面我再介绍一款NB的终端抓包工具 tcpdump 1、混杂模式 linux的网卡有混杂模式一说,当开…...
TMS320F28P550SJ9学习笔记8:I2C通信的结构体寄存器配置的了解
继续学习IIC通信的寄存器配置方式:尝试使用寄存器方式配置了解I2C a 没条件完整测试IIC功能,具体的修改与测试留在下文,这里只贴出全部代码,就不提供工程了 文章提供测试代码讲解、完整工程下载、测试效果图 目录 IIC通信引脚&a…...
TypeScript类:面向对象编程的基石
一、从现实世界到代码世界 想象你要建造一栋房子,首先需要一张设计蓝图——它定义了房屋的结构(几个房间)、功能(卧室/厨房)和特性(材料/颜色)。在TypeScript中,class就是这个设计蓝…...
C语言学习笔记-进阶(10)自定义类型:结构体
1. 结构体类型的声明 前面我们在学习操作符的时候,已经学习了结构体的知识,这里稍微复习一下。 1.1 结构体回顾 结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.1.1 结构体的声明 struct tag {member-…...
Java 大视界 -- Java 大数据在智能家居能源管理与节能优化中的应用(120)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
upload-labs-master通关攻略(9~12)
Pass-9 建立1.php <?php phpinfo();?> 上传时抓包 修改代码 在1.php后面加点号空格点号 放行后得到 Pass-10 将1.php放入 上传时抓包 修改代码 将1.php改为1.pphphp 上传后得到 Pass-11 将1.php改为1.png 上传时抓包 修改代码 ../upload/2.php%00 放行后得到 Pass…...
python语言总结(持续更新)
本文主要是总结各函数,简单的函数不会给予示例,如果在平日遇到一些新类型将会添加 基础知识 输入与输出 print([要输出的内容])输出函数 input([提示内容]如果输入提示内容会在交互界面显示,用以提示用户)输入函数 注释 # 单行注释符&…...
UI自动化测试 —— web端元素获取元素等待实践!
前言 Web UI自动化测试是一种软件测试方法,通过模拟用户行为,自动执行Web界面的各种操作,并验证操作结果是否符合预期,从而提高测试效率和准确性。 目的: 确保Web应用程序的界面在不同环境(如不同浏览器、操作系统)下…...
【CXX】6.6 UniquePtr<T> — std::unique_ptr<T>
std::unique_ptr 的 Rust 绑定称为 UniquePtr。有关 Rust API 的文档,请参见链接。 限制: 目前仅支持 std::unique_ptr<T, std::default_delete>。未来可能会支持自定义删除器。 UniquePtr 不支持 T 为不透明的 Rust 类型。对于在语言边界传递不…...
【网络协议安全】任务10:三层交换机配置
CSDN 原创主页:不羁https://blog.csdn.net/2303_76492156?typeblog三层交换机是指在OSI(开放系统互连)模型中的第三层网络层提供路由功能的交换机。它不仅具备二层交换机的交换功能,还能实现路由功能,提供更为灵活的网…...
C语言每日一练——day_4
引言 针对初学者,每日练习几个题,快速上手C语言。第四天。(连续更新中) 采用在线OJ的形式 什么是在线OJ? 在线判题系统(英语:Online Judge,缩写OJ)是一种在编程竞赛中用…...
文件系统调用(上) ─── linux第17课
目录 linux 中man 2和man 3的区别 文件内容介绍 C语言文件接口 示例: 输出信息到显示器,你有哪些方法 总结: 系统文件I/O 文件类的系统调用接口介绍 示例 open 函数具体使用哪个,和具体应用场景相关, write read close lseek ,类比C文件相关接…...
在 Spring Boot 中实现基于 TraceId 的日志链路追踪
1 前言 1.1 什么是 TraceId? TraceId 是一个唯一的标识符,用于跟踪分布式系统中的请求。每个请求从客户端发起到服务端处理,再到可能的多个微服务调用,都会携带这个 TraceId,以便在整个请求链路中进行追踪和调试。 1.2 日志链路追踪的意义 日志链路追踪可以帮助开发者…...
STM32 HAL库 CAN过滤器配置
之前在STM32 f407 CAN收发 基于HAL库和Cubemx配置_stm32f407can收发程序-CSDN博客这篇博文里写了一下配置CAN收发的方法,当时由于并没有使用过滤器的现实需求,所以就也没仔细研究。现在工作中确实需要用到过滤器了,有些项目中控制器和发动机E…...
C++ 控制结构与函数全面解析
引言 在 C 编程中,控制结构和函数是构建程序逻辑的关键要素。控制结构能够决定程序的执行流程,而函数则可以将代码模块化,提高代码的复用性和可维护性。本文将深入介绍 C 中的控制结构和函数的相关知识。 一、控制结构 1. if - else 语句 …...
基于django+pytorch(Faster R-CNN)的钢材缺陷识别系统
一、训练数据来源以及数据标注 数据来源于阿里云天池实验室公开数据集中的铝型材缺陷检测数据集APDDD 数据标注通过labelme进行标注,图片所有标注以转化为矩形标注,存放成json格式。 二、模型训练方式及结果 缺陷识别模型基于Faster R-CNN ResNet5…...
C++多态
多态 多态分为:静态多态(函数重载,运算符重载)和动态多态(派生类、虚函数) 二者区别:静态多态是在地址编译时绑定,而动态多态是在地址运行时绑定 动态多态的特点: 1.有继承关系 2.子类重写父类虚函数(就是跟父类行为函数名称一样,但是是作为子类的行为) 动态多态的…...
【一句话经验】ubuntu vi/vim 模式自动设置为paste
从centos过来,发现ubutun有些地方不习惯,尤其是vi的粘贴,默认自动进去了代码模式,导致每次粘贴必须得set paste,否则会出现问题。 解决办法非常简单,按照下面命令执行即可: cd ~ echo "…...
MongoDB 触发器实现教程
在传统的关系型数据库(如 MySQL)中,触发器是一种强大的工具,它可以在特定的数据库操作(如插入、更新或删除)发生时自动执行一段代码。然而,MongoDB 并没有原生内置的触发器概念。不过࿰…...
ESP8266 NodeMCU 与 Atmega16 微控制器连接以发送电子邮件
NodeMCU ESP8266 AVR 微控制器 ATmega16 的接口 Atmega16 是一款低成本的 8 位微控制器,比以前版本的微控制器具有更多的 GPIO。它具有所有常用的通信协议,如 UART、USART、SPI 和 I2C。由于其广泛的社区支持和简单性,它在机器人、汽车和自动化行业有广泛的应用。 Atmega1…...
《算法笔记》8.1小节——搜索专题->深度优先搜索(DFS)问题 C: 【递归入门】组合+判断素数
题目描述 已知 n 个整数b1,b2,…,bn 以及一个整数 k(k<n)。 从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。 例如当 n4,k=3,4 个整数分别为 3,7,12…...
重生之我在学Vue--第8天 Vue 3 UI 框架(Element Plus)
重生之我在学Vue–第8天 Vue 3 UI 框架(Element Plus) 文章目录 重生之我在学Vue--第8天 Vue 3 UI 框架(Element Plus)前言一、Element Plus 基础:从安装到组件革命1.1 安装与两种引入模式全量引入(适合快速…...
从前端视角理解消息队列:核心问题与实战指南
消息队列(Message Queue)是现代分布式系统的核心组件之一,它在前后端协作、系统解耦、流量削峰等场景中发挥着重要作用。本文从前端开发者视角出发,解析消息队列的关键问题,并结合实际场景给出解决方案。 一、为什么要…...
Mysql配置文件My.cnf(my.ini)配置参数说明
一、my.cnf 配置文件路径:/etc/my.cnf,在调整了该文件内容后,需要重启mysql才可生效。 1、主要参数 basedir path # 使用给定目录作为根目录(安装目录)。 datadir path # 从给定目录读取数据库文件。 pid-file filename # 为mysq…...
Docker 安装成功后,安装 Dify 中文版本的步骤
Docker 安装成功后,安装 Dify 中文版本的步骤如下1: 克隆 Dify 代码仓库:在终端中执行以下命令,将 Dify 源代码克隆至本地环境。 bash git clone https://github.com/langgenius/dify.git进入 Dify 的 docker 目录: b…...
Spring(4)——响应相关
一、返回静态页面 1.1**RestController和Controller** 想返回如下页面: 如果我们依旧使用原来的**RestController** 可以看到的是仅仅返回了字符串。 此时将**RestController改为Controller** 可以看到这次返回的是html页面。 那么**RestController和Controller…...
LPDDR5x电源使用Si电容对PI和PSIJ影响分析
SoC可能包含许多高速接口,其中LPDDR5X目前因为高带宽、低功耗、大容量等性能优势开始逐渐在AI计算、5G通信、视频处理等领域开始使用。LPDDR5X目前的速率高达8.533 GT/s,以及多个为这些接口供电的IO电压轨,而这些IO轨的PDN需要提供低阻抗&…...
[网络爬虫] 动态网页抓取 — Selenium 介绍 环境配置
🌟想系统化学习爬虫技术?看看这个:[数据抓取] Python 网络爬虫 - 学习手册-CSDN博客 0x01:Selenium 工具介绍 Selenium 是一个开源的便携式自动化测试工具。它最初是为网站自动化测试而开发的,类似于我们玩游戏用的按…...
MySQL数据库操作
目录 SQL语句 1、SQL的背景 2、SQL的概念 SQL的分类 SQL的书写规范 MySQL数据库 1、MySQL数据库的编码 (1)utf8和utf8mb4的区别 (2)MySQL的字符集 (3)MySQL默认编码为 latin1 ,如何更改…...
java之uniapp实现门店地图
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、后台实现1. 获取门店的经纬度2.api查询对应的sql 二 、小程序实现 前言 实现查询门店地址的功能,可以按照距离排序。使用技术:java…...
Git基本概念及使用
目录 一、git安装 二、git仓库基本概念 1. 远程仓库(Remote): 2. 本地库(Repository): 3. 分支(Branch): 4.本地库和远程库的关系 三、git仓库的工作流程 四、gi…...
游戏引擎学习第147天
仓库:https://gitee.com/mrxiao_com/2d_game_3 上一集回顾 具体来说,我们通过隐式计算来解决问题,而不是像数字微分分析器那样逐步增加数据。我们已经涵盖了这个部分,并计划继续处理音量问题。不过,实际上我们现在不需要继续处理…...
docker私有仓库配置
基于 harbor 构建docker私有仓库 1、机器准备 os:openEuler 、rockylinux mem:4G disk:100G 2、关闭防火墙、禁用SELinux 3、安装docker和docker-compose yum install docker-ce -y配置加速 vim /etc/docker/d…...
PostgreSQL 18新特性之虚拟生成列
PostgreSQL 12 提供了生成列(GENERATED ALWAYS AS STORED)功能,但是只能支持存储型的生成列,需要占用存储空间,更新成本高。 为此,PostgreSQL 18 即将引入一个新的增强:虚拟生成列。这种类型的…...
燃气对我们生活的重要性体现在哪里?
燃气在我们的生活中有 多方面的重要性 ,以下是燃气对我们生活的重要性的详细说明: 烹饪和热水供应 : 燃气是家庭烹饪的主要能源,能够快速、高效地加热食物,使家庭聚餐更加便捷和愉快。 燃气热水器能够在短时间内提供…...
简易分析 uni.chooseImage 拍照上传的基本知识点(附Demo)
目录 前言1. 基本知识2. Demo 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 基本的介绍也可看官网:uni.chooseImage(options) 以下知识点主要用于学习了解,从实战中出发 1. 基本知识…...
私域流量时代的创新实践:以定制开发开源AI智能名片与S2B2C商城小程序源码为例的深度研究
摘要:在数字化转型的浪潮中,私域流量已成为企业获取用户、增强品牌影响力及实现销售转化的关键路径。本文首先概述了私域流量的概念及其重要性,随后通过分析故宫文创、B站跨年晚会及美妆品牌“完美日记”的成功案例,深入探讨了私域…...
preloaded-classes裁剪
系统预加载了哪些class类?system/etc/preloaded-classes 修改源代码? frameworks\base\config\preloaded-classes 默认位置,如果改了不生效,可能有其它模块的mk文件指定了preloaded-classes覆盖了framework模块,例如…...
JavaScript性能优化实战
在 JavaScript 开发中,性能优化是一个至关重要的方面,它可以提升应用的响应速度、减少资源消耗,从而提供更好的用户体验。以下是从多个方面进行 JavaScript 性能优化的详细实战内容: 1. 代码加载优化 1.1 异步加载脚本 使用 as…...
文件和异常
从文件中读取数据 读取整个文件 读取整个文件 要读取文件,需要一个包含几行文本的文件。下面首先创建一个文件,它包含精确 到小数点后30位的圆周率值,且在小数点后每10位处换行: pi_digits.txt 3.14159265358979323846264338…...
【AI大模型】LLM训练deepseek如何识别视频
要让像DeepSeek这样的大语言模型(LLM)具备视频识别能力,需要结合多模态学习技术,将视觉信息与文本语义进行融合。以下是实现这一目标的关键步骤和技术要点: --- 一、视频识别的核心挑战 1. 多模态数据:视频…...
【机械视觉】C#+VisionPro联合编程———【五、硬币检测小项目实现(C#+VisionPro联合编程和csv文件格式操作)】
【机械视觉】C#VisionPro联合编程———【五、硬币检测小项目实现(C#VisionPro联合编程和csv文件格式操作)】 项目介绍 总共有十二张检测的图片,当点击检测按钮时检测当前展示的图片并且将检测效果展示在表格中,当点击上一页或下一页时换检测图片&…...
空间域与频域图像处理
第一部分:空间域图像处理(Part 1) 1. 点操作(Pixel-wise Operations) 定义:仅基于单个像素的灰度值进行变换,不依赖邻域信息。 常见操作: 2. 邻域操作(Neighborhood O…...
使用DeepSeek+蓝耘快速设计网页简易版《我的世界》小游戏
前言:如今,借助先进的人工智能模型与便捷的云平台,即便是新手开发者,也能开启创意游戏的设计之旅。DeepSeek 作为前沿的人工智能模型,具备强大的功能与潜力,而蓝耘智算云平台则为其提供了稳定高效的运行环境…...
使用 React 和 Ant Design 处理 Excel 和 CSV 文件
在现代 Web 开发中,文件上传和解析是常见的需求。本文将介绍如何使用 React 和 Ant Design 库来处理 Excel 和 CSV 文件的上传,并将提取的表头信息展示在表格中。 1. 项目基础 确保你已经创建了一个 React 项目,并安装了必要的依赖。可以使…...
js 使用 Web Workers 来实现一个精确的倒计时,即使ios手机锁屏或页面进入后台,倒计时也不会暂停。
## 效果如上 <!-- 将 main.js 和 worker.js 放在同一个目录下,然后在 HTML 文件中引入 main.js --><!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&q…...