【js】事件循环之promise的async/await与setTimeout

什么是事件循环

事件循环又叫消息循环,是浏览器渲染主线程的工作方式。

浏览器开启一个永不停止的for循环,每次循环都会从消息队列中取任务,其他线程只需要在合适的时候将任务加入到消息队列的末尾。

过去分为宏任务和微任务,现在由于浏览器环境越来越复杂,宏任务的说法已经不合适,取而代之的是w3c官网新提出的,每个任务都会带有任务类型,同类型的任务放在同对列,不同的任务可以放在不同的对列,不同的对列有不同的优先级,(任务没有优先级)由浏览器自行决定优先执行哪一个,但是总会有一个微队列,优先级最高

在这里插入图片描述

什么是async与await

async/await是JavaScript中处理异步操作的一种方式,它是基于Promise的语法糖。

async关键字用于声明一个函数是异步的,而await关键字用于等待一个Promise解析完成。

此时可以认为,在await之后的代码其实是promise完成之后才执行,也就是说相当于promise.then回调执行的的内容,只是通过async / await语法糖解决了promise的回调嵌套问题

事件循环中的同步任务与异步任务

众所周知,同步任务即按顺序执行,异步任务即开启新线程与主线程并行执行

常见的异步任务有 promise、setTimeout、nextTick等,而这些在之前又分为宏任务和微任务,但其实现在官方更改了宏任务的说法,提出分类型的任务队列(后面统称为其他异步队列)和微队列,微队列的优先级高于其他异步队列。promise.then和nextTick属于微任务,会进入微队列
在这里插入图片描述

在事件循环过程中,按顺序处理当前消息队列中的任务; 当遇到await关键字时,JavaScript会将该异步函数暂停(也就是指暂停当前 async function 内部await之后的代码执行)

其实此时await后面的代码产生一个微任务,进入微队列,浏览器主线程将其放入微队列后将继续执行消息队列中的任务,直到消息队列中的任务全部执行完成之后,微队列的任务才会进入到消息队列去执行

需要注意的是,虽然await会暂停代码执行,但它不会阻塞事件循环。这意味着其他任务(已在消息队列中的后面的任务)可以在等待Promise解析期间继续执行。

案例

async function async1 () {console.log(1)await async2()console.log(2)
}async function async2 () {console.log(3)
}console.log(4)setTimeout(function () {console.log(5)
}, 0)async1()new Promise(function (resolve) {console.log(6)resolve()
}).then(function () {console.log(7)
})console.log(8)// 4 1 3 6 8 2 7 5

解析

首先解析这些js代码,将任务按照代码执行顺序放入消息队列,初始队列如下图
在这里插入图片描述

开始执行之后

1、首先控制台输出4
2、其次执行setTimeout,为异步任务,并且不是微任务,放入其他异步队列,交给其他线程进行处理
3、执行到async1(),进入async1()函数内部执行

async function async1 () {console.log(1)await async2()console.log(2)
}

进入async1()函数内部开始执行

1、控制台输出1
2、进入async2()执行并等待,也就是将await async2()后面的内容console.log(2)放入微队列等待promise解析完成后放入消息队列。而async2()内部只有console.log(3),是同步任务,立即执行,控制台输出3。此时的消息队列图如下
在这里插入图片描述

继续执行,进入new Promise()

1、控制台输出6
2、.then()放入微队列
3、继续执行控制台输出8,此时的消息队列图如下

在这里插入图片描述

消息队列清空后,微队列的任务进入消息队列,继续执行

1、控制台输出2
2、执行then函数,输出7
3、微队列任务清空,其他异步队列任务进入消息队列开始执行
在这里插入图片描述

控制台输出5,至此所有任务执行完毕,控制台输出 4 1 3 6 8 2 7 5
在这里插入图片描述

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

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

相关文章

wordpress模板官网

移民wordpress主题 移民代办wordpress主题,适合做海外移民咨询的代理公司搭建wordpress企业官方网站使用。 https://www.jianzhanpress.com/?p5130 夏令营wordpress主题 绿色夏令营wordpress主题,适合做夏令营或户外拓展的公司搭建wordpress官方网站…

D2587A高压大电流DC-DC——专为反激式、升压和正向转换器应用而设计的单片集成电路

1、概述 D2587A稳压器是专为反激式、升压和正向转换器应用而设计的单片集成电路。该器件提供四种不同的输出电压版本:3.3V、5V、12V 和可调节电压。这些稳压器需要的外部元器件很少,因此具有成本效益,并且易于使用。该电源开关是一款5A NPN器…

面试经典150题——最小栈

​Life is a journey, theres no right or wrong. 1. 题目描述 2. 题目分析与解析 2.1 思路一 看到题目的一瞬间,有没有注意到 常数时间内检索到最小元素的栈,那说明我们肯定需要把最小元素的下标存储起来,这样才能在常数时间内找到。 其…

网工学习 DHCP配置-接口模式

网工学习 DHCP配置-接口模式 学习DHCP总是看到,接口模式、全局模式、中继模式。理解起来也不困难,但是自己动手操作起来全是问号。跟着老师视频配置啥问题没有,自己组建网络环境配置就是不通,悲催。今天总结一下我学习接口模式的…

揭秘8.4k星开发者的秘密武器:it-tools在线工具集,你不可不知!

在IT的世界里,为了更好地发挥自己的才能,必须善用优秀的工具。深入挖掘IT-Tools的神奇力量,让你的工作像魔法一般变得轻松高效!无论是自动化、监控还是问题解决,这些工具是我们事业成功的关键利器。选择合适的IT工具&a…

PlantUML - 时序图

时序图主要内容 下面是一个简单的时序图,我们可以很容易并且美观的表达我们的交互流程,只需要在箭头的两边指定一个名字,加上描述即可: startuml bkloanapply -> bkloanapprove : request bkloanapprove --> bkloanapply :…

C++ map用法

int main() {void *p;str *st;st (str*)malloc(sizeof(str));st->a 23;st->b 24;p st;//使用void指针需强制类型转换printf("%d\n%d\n",((str*)p)->a, ((str*)p)->b);free(st);map<char, int> mpci;mpci[m] 20;mpci.insert(pair<char, int…

#WEB前端(盒子模型)

1.实验&#xff1a;盒子 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; margin&#xff08;外边距&#xff09; border&#xff08;边框&#xff09; padding&#xff08;内边距&#xff09; 4.代码&#xff1a; <!DOCTYPE html> <html lang"en"> &…

【C++】类与对象(static、explicit、友元、隐式类型转换、内部类、匿名对象)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 再谈构造函数 初始化列表 隐式类型转换 explicit关键字 static成员 概念 计算程序中创建出了多少个类…

力扣61:旋转链表

题目 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2输出&#xff1a;[4,5,1,2,3] 示例 2&#xff1a; 输入&#xff1a;head [0,1,2], k 4输出&#xff1a;…

卷积神经网络(CNN)原理与实现

卷积神经网络(CNN) 卷积神经网络原理卷积神经网络的数学推导卷积层反向传播算法数学推导卷积层实现代码 卷积神经网络(CNN) 卷积神经网络原理 卷积神经网络是一种用于图像、语音、自然语言等数据的深度学习模型&#xff0c;其核心思想是使用卷积操作提取输入数据的特征&…

4、通达OA代码审计

一、文件操作 1、文件上传配合文件包含审计 文件上传首先确定存在漏洞的文件。和文件上传相关的函数比如upload。在从上到下分析构造的条件1. 从 POST 请求中提取变量 P 的值。 2. 检查 P 是否已设置且不为空字符串。 3. 如果 P 已设置且非空&#xff0c;进入包含 "inc/…

[NSSCTF 2nd]MyJs

做一题ejs原型链污染 首先是登录界面 源码里面提示了源码的路由 js不熟先审计一下 const express require(express); #导入Express框架&#xff0c;用于构建Web应用程序的服务器和路由 const bodyParser require(body-parser); #导入body-parser中间件&#xff0c;用于解析…

软考证书=职称证书?

官方的回答 根据《计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试暂行规定》&#xff08;国人部发〔2003〕39号&#xff09;规定&#xff0c;通过考试并获得相应级别计算机专业技术资格&#xff08;水平&#xff09;证书的人员&#xff0c;表明其已具备从事相…

使用Javassist 在android运行时生成类

序言 最近在写框架&#xff0c;有一个需求就是动态的生成一个类&#xff0c;然后查阅了相关文献&#xff0c;发现在android中动态生成一个类还挺麻烦。因次把一些内容分享出来&#xff0c;帮助大家少走弯路。 方案一 DexMaker DexMaker 是一个针对 Android 平台的库&#xf…

Myqsort:基于冒泡排序算法的C语言实现

我们将详细介绍一个基于冒泡排序算法的自定义排序函数——Mysqrt。该函数通过使用用户提供的比较函数进行元素间的比较&#xff0c;并结合swap交换函数对任意类型的数据进行排序。下面是对代码的逐行解析。 逻辑导图 代码实现 // 头文件 #include<stdio.h>// 定义比较函…

华为自动驾驶技术详解报告分享

ADS2.0首发搭载问界M5智驾版&#xff0c;城市NCA计划年底全国开通。2023年4月16日华为在智能汽车解决方案发布会上发布了最新的ADS2.0产品&#xff0c;硬件数量减少至27个(11个摄像头12个超声波雷达3个毫米波雷达1个激光雷达,ADS1.0有34个)&#xff0c;车载计算平台改为MDC610&…

python自学2

第一阶段第三章 if&#xff0c;elif&#xff0c;else语句 这个是有顺序的&#xff0c;如果第一个满足下面的就不会执行&#xff0c;else也可以不写&#xff0c;执行的效果等同于三个独立的if。 还可以写的更加简洁一些 直接输入的参数带入到判断里面去 小练习&#xff1a; 做…

打造专属投屏体验:Windows系统投屏到iOS系统

想要将电脑投屏共享给同事或朋友&#xff0c;又担心隐私内容泄露&#xff1f;来来来&#xff0c;这里有妙招&#xff01; AirDroid Cast网页版让电脑投屏变得挑剔&#xff0c;只展示你允许共享的内容。会议资料、个人照片、敏感文件&#xff0c;都将得到严格的筛选&#xff0c;…

云原生之容器编排实践-ruoyi-cloud项目部署到K8S:Nacosv2.2.3

背景 前面搭建好了 Kubernetes 集群与私有镜像仓库&#xff0c;终于要进入服务编排的实践环节了。本系列拿 ruoyi-cloud 项目进行练手&#xff0c;按照 MySQL &#xff0c; Nacos &#xff0c; Redis &#xff0c; Nginx &#xff0c; Gateway &#xff0c; Auth &#xff0c;…