异步背后的奥秘:事件循环

异步背后的奥秘:事件循环

复习环节

JavaScript运行时

我们都知道,JavaScript本身是一个单线程的,那JavaScript是如何处理同时发生的多个任务的呢?

  1. 首先JavaScript引擎运行在一个容器中,这个容器可能是浏览器或者node中;

  2. JavaScript对象存储在内存中的位置,我们称之为堆

  3. 实际执行JavaScript上下文代码是调用栈(Call Stack);

  4. 然后网页 中提供了很多的Web API提供给引擎使用,比如DOM,计时器,Fetch API等等

  5. 然后就是事件循环了,这个是JavaScript运行事的关键部分,他负责处理异步操作和任务队列;有事件循环了,JavaScript就可以在主线程中运行非阻塞式的操作了;事件循环实现一般就是通过回调队列,来自事件需要准备执行的函数,例如点击事件、计时器、一些数据等等;

异步JavaScript如何在幕后工作

  • 先看一段代码片段
el = document.querySelector('img');
el.src = 'dog.jpg';
el.addEventListener('load', () => {el.classList.add('fedeIn');
});fetch('https://xxxxxxx/api').then(res => console.log(res));//后续代码
  1. 调用堆栈 Call Stack

JavaScript是单线程的,只有一个调用堆栈,用于执行上下文代码,遵循先入后出的原则

  • 所以第一行代码会立即执行,变量赋予;

  • 第二行浏览器就开始尝试加载图片;

  • 第三行的load监听事件,会等待图片加载完成后,回调函数就会被放入回调队列中,注意,由于是load事件,这并不会阻塞上下文的代码执行;

  • fetch异步操作,它是一个网络请求,也会立即执行,返回一个promise,这个网络请求的处理会交给浏览器Web APIs

  1. Web APIs

它是浏览器提供的功能,它允许JavaScript执行异步的操作,不会阻塞主线程,所有操作是由浏览器在后台处理

  • 比如这里的图片加载喝fetch请求
  1. 微任务队列 Microtask Queue

它主要是存放Promise的回调函数,它的优先级高于回调队列,事件循环会优先处理它的任务;

  • fetch的回调函数,当网络请求完成之后,then中的回调函数就会被访问微任务队列优先处理
  1. 回调队列

它就是存放异步操作的回调函数了,比如DOM事件,定时器等等;

  • 比如上述代码中的图片加载,当加载完成后,load事件就会被放入回调队列
  1. 事件循环

它是JavaScript异步操作的核心,它会一直检查调用堆栈喝任务列表,主要是一下的步骤:

  • 当调用堆栈为空,就会调出任务队列取出任务并且执行

  • 如果微任务队列为空,就会处理回调队列的任务;

  • 所以在上述的代码中,fetch完成后会将回调函数放入微任务队列中,事件循环处理完微任务后,执行console.log(res);当图片加载完成后,load事件回调函数被放入回调队列中,微任务队列完成后,执行el.classList.add('fedeIn;

总结:

  • 经过上述的讲解,就能明白JavaScript这种多线程的模型,可以实现异步代码不阻塞主线程的执行;

  • 在我们编程中,一切外部资源的等待,完全交给浏览器和运行时的环境,这样可以有效的节省CPU和内存的资源;

  • 利用这种异步操作,也使得JavaScript对于用户交互更加的灵活,也可以更快的响应用户的操作;

  • 事件循环和任务队列也可以不创建多个线程的情况下,处理大量的并发请求;

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

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

相关文章

Live555、FFmpeg、GStreamer介绍

Live555、FFmpeg 和 GStreamer 都是处理流媒体和视频数据的强大开源框架和工具,它们广泛应用于实时视频流的推送、接收、处理和播放。每个框架有不同的设计理念、功能特性以及适用场景。下面将详细分析这三个框架的作用、解决的问题、适用场景、优缺点,并…

CUDA与Microsoft Visual Studio不兼容问题

简介:在安装一些 python库时,涉及到第三方库(特别是需要引用 C 代码)时,通常的安装方式会涉及到编译过程,通常称为"源代码安装"(source installation),或是 “…

Unity2D无限地图的实现(简单好抄)

说明:本教程实现的是在2D游戏中玩家在游戏中上下左右移动的时候自动进行地图拼接的功能,如果你只想实现左右移动的无限地图,那么这篇博客也能起到一定参考作用。 思路 第一步: 创建一个10*10的2D游戏对象当做地图 第二步创建一个…

Object.defineProperty() 完整指南

Object.defineProperty() 完整指南 1. 基本概念 Object.defineProperty() 方法允许精确地添加或修改对象的属性。默认情况下,使用此方法添加的属性是不可修改的。 1.1 基本语法 Object.defineProperty(obj, prop, descriptor)参数说明: obj: 要定义…

使用云计算开发App 有哪些坑需要避免

当我们在云计算环境下开发App时,往往会觉得一切都变得“轻松”了。毕竟,云计算提供了无限的计算资源、灵活的存储方案,还有自动化的服务,仿佛有了一个万能的工具箱,啥都能搞定。可是,别被这种“轻松”外表骗…

C13.【C++ Cont】初识string类字符串的迭代器

目录 1.迭代器的定义 2.迭代器的作用 3.string类字符串的常用迭代器 4.第3点的两个迭代器的使用 示例代码1:解引用 运行结果 示例代码2 运行结果 示例代码3:用迭代器正序遍历字符串 运行结果 示例代码4:用迭代器逆序遍历字符串 运行结果 示例代码5:用迭代器修改字…

HTML——13.超链接

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>超链接</title></head><body><!--超链接:从一个网页链接到另一个网页--><!--语法&#xff1a;<a href"淘宝网链接的地址"> 淘宝…

进程间通信的“五大武器”

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

【机器学习】分类

文章目录 1. 能否用回归解决分类问题2. 生成模型&#xff08;概率生成&#xff09;3. 判别模型&#xff08;逻辑回归&#xff09;4. 多分类问题 1. 能否用回归解决分类问题 二元分类 数据分布不规律&#xff0c;回归函数会尽量减少误差&#xff0c;导致不合理的偏移离分界较远…

《代码随想录》Day22打卡!

回溯算法 《代码随想录》回溯算法&#xff1a;组合 本题完整题目如下&#xff1a; 本题的完整思路如下&#xff1a; 1.本题使用回溯算法&#xff0c;其实回溯和递归是一样的道理&#xff0c;也是分为三步曲进行&#xff1a; 2.第一步&#xff1a;确定递归函数的返回值和参数&…

鱼眼相机模型与去畸变实现

1.坐标系说明 鱼眼相机模型涉及到世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换关系。对于分析鱼眼相机模型&#xff0c;假定世界坐标系下的坐标点,经过外参矩阵的变换转到相机坐标系&#xff0c;相机坐标再经过内参转换到像素坐标&#xff0c;具体如下 进一步进…

[图形渲染]【Unity Shader】【游戏开发】 Shader数学基础17-法线变换基础与应用

在计算机图形学中,法线(normal) 是表示表面方向的向量。它在光照、阴影、碰撞检测等领域有着重要作用。本文将介绍如何在模型变换过程中正确变换法线,确保其在光照计算中的正确性,特别是法线与顶点的变换问题。 1. 法线与切线的基本概念 法线(Normal Vector) 法线(或…

我的2024年度总结2025展望

2025已经到来&#xff0c;下面是我对2024年的个人总结&#xff0c;以及对2025年的未来展望。 2024总结——峰回路转 2024大概是我大学这几年收获最满的一年&#xff0c;我不仅收获了丰富的技术内容&#xff0c;也提高了例如情商、管理能力、团队协作、开源思想等技术之外的事…

Windows 下安装 triton 教程

目录 背景解决方法方法一&#xff1a;&#xff08;治标不治本&#xff09;方法二&#xff1a;&#xff08;triton-windows&#xff09;- 安装 MSVC 和 Windows SDK- vcredist 安装- whl 安装- 验证 背景 triton 目前官方只有Linux 版本&#xff0c;若未安装&#xff0c;则会出…

如何使用网络工具进行网络性能评估

网络评估是对IT基础设施的系统评估&#xff0c;以确保它能够很好地满足企业的核心运营需求&#xff0c;确定了基础设施中需要改进的领域&#xff0c;并定义了改进的范围。 网络评估工具分析IT基础设施的各个方面&#xff0c;它通过评估网络设备、网络性能和安全威胁来仔细检查…

Vue.js组件开发-实现动态切换菜单简单示例

在Vue.js中&#xff0c;实现动态切换菜单通过组件化开发和Vue的响应式数据绑定来实现。 示例&#xff1a; 展示如何创建一个可以动态切换菜单的Vue组件。 首先&#xff0c;需要定义一个Vue组件&#xff0c;该组件将包含菜单项和用于切换菜单的状态。 1. 创建Vue组件 <t…

【笔记_连续发请求的问题】

疑问&#xff1a; 连续给同一个账号下的同一个应用发送三次启动应用请求&#xff0c;顺序是&#xff1a;订单1、订单2、订单3&#xff0c;但是有时候的执行顺序是&#xff1a;订单1、订单3、订单2 不管用不用队列&#xff0c;用不用webhook&#xff0c;都会出现这种情况 回答…

Vue项目整合与优化

前几篇文章&#xff0c;我们讲述了 Vue 项目构建的整体流程&#xff0c;从无到有的实现了单页和多页应用的功能配置&#xff0c;但在实现的过程中不乏一些可以整合的功能点及可行性的优化方案&#xff0c;就像大楼造完需要进行最后的项目验收改进一样&#xff0c;有待我们进一步…

Python、R用深度学习神经网络组合预测优化能源消费总量时间序列预测及ARIMA、xgboost对比...

全文链接&#xff1a;https://tecdat.cn/?p38726 分析师&#xff1a;Qingxia Wang 在能源领域&#xff0c;精准预测能源消费总量对制定合理能源战略至关重要。当前&#xff0c;能源消费预测分析主要运用单一模型&#xff08;如灰色预测法、时间序列分析法等&#xff09;和组合…

STM32使用UART发送字符串与printf输出重定向

首先我们先看STM32F103C8T6的电路图 由图可知&#xff0c;其PA9和PA10引脚分别为UART的TX和RX(注意&#xff1a;这个电路图是错误的&#xff0c;应该是PA9是X而PA9是RX&#xff0c;我们看下图的官方文件可以看出)&#xff0c;那么接下来我们应该找到该引脚的定义是什么&#xf…