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

news2024/9/23 7:20:41

什么是事件循环

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

浏览器开启一个永不停止的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.coloradmin.cn/o/1487493.html

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

相关文章

数据分析工具在不同行业中有什么不同的需求?

数据建模也是数据分析的一个分支 一、交管行业,对于数据建模的需求如下 1、根据分析方法可以将交管大数据模型分为统计分析类、业务规则类、预测预警类、异常分析类、画像分析类和综合评价类六大类,具体如下: 2、模型的实现过程 二、各类工…

写时复制简介

写时复制技术(Copy on Write)是比较常用的一种技术,它的主要目的是延迟减少以及延迟内存的分配,增加执行效率,只有在真正进行写操作的过程中才会真正分配物理资源。同时,也可以保护数据在系统崩溃时出现的丢失。比如,我…

视频云平台——搭建SRS5平台支持GB28181视频流的推送

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅…

逆向案例四:360k静态和精灵数据动态AES解密,用js的方法

一、360K 网页链接:https://www.36kr.com/p/2672600261670407 页面中有静态的需要解密的内容,确定html包,确定方法 1.1方法步骤 在下方的搜索中输入decrypt(或者关键字window.initialState ,进入js文件 在AES.decrypt处打上断点&#xff0…

MySQL面试题-事务(答案版)

事务 1、事务与存储引擎的关系 事务是由 MySQL 的引擎来实现的,我们常见的 InnoDB 引擎它是支持事务的。 不过并不是所有的引擎都能支持事务,比如 MySQL 原生的 MyISAM 引擎就不支持事务,也正是这样,所以大多数 MySQL 的引擎都…

hnust 湖南科技大学 2023 综合实训3(软件工程)课设 完整代码及数据库+报告+uml等图源文件+指导书

hnust 湖南科技大学 2023 综合实训3(软件工程)课设 完整代码及数据库报告uml等图源文件指导书 介绍 老师考核等级为优,系统多次测试,未发现bug 项目前后端分离,前端vue2工程项目,后端springboot&#xff…

知乎语音下载(mediadown)

知乎语音下载(mediadown) 一、介绍 知乎语音下载,能够帮助你下载知乎知学堂课程中的语音和视频。它不能帮你越过会员权限,下载你没权限访问的语音和视频。 二、下载地址 本站下载:知乎语音下载(mediadown) 百度网盘下载:知乎语音下载(mediadown) 三、安装教程 …

创业者的智选:知识付费小程序定制开发服务解析

探索知识付费领域的新时代,选择专业的知识付费小程序定制开发服务,打造个性化、高效的知识传播平台。无论您是企业、机构还是个体创作者,都能助您成功变现知识资产。 知识付费小程序的开发是一个涉及多方面技术的综合性工程。下面提供一些关…

利用redis实现秒杀功能

6、秒杀优化 这个是 图灵 的redis实战里面的一个案例 6.1 秒杀优化-异步秒杀思路 我们来回顾一下下单流程 当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤…

Linux:Kubernetes(k8s)基础理论笔记(1)

我笔记来源的图片以及共享至GitHub,本章纯理论。这是k8s中部分的基础理论 👇 KALItarro/k8spdf: 这个里面只有一个pdf文件 (github.com)https://github.com/KALItarro/k8spdf👆 什么是kubernetes kubernetes 是一个开源的,用于管…

二、TensorFlow结构分析(1)

目录 1、TF数据流图 1.1 TensorFlow结构分析 1.2 案例 2、图与TensorBoard 2.1 图结构 2.2 图相关操作 2.2.1 默认图 2.2.2 创建图 2.3 TensorBoard:可视化学习 2.3.1 数据序列化 - events文件 2.3.2 启动TensorBoard 2.4 OP 2.4.1 常见OP 2.4.2 指令…

呵护宝贝的肌肤当然要从小做起啦~

亲子系列~来个防晒衣 防晒还真的挺重要的 尤其是女生,防晒要从小做起哈 这款做的防晒面料,有抗紫外线吊牌 可以放心去穿,质地柔软轻盈又透气 防晒护肤双合一,四个颜色每个都很好看 很适合春夏季,很干净清爽 泳衣…

LeetCode.232. 用栈实现队列

题目 232. 用栈实现队列 分析 先了解一下栈和队列的特点: 栈:先进后出队列:先进先出 想用栈实现队列的特点,就需要使用两个栈。因为两个栈就可以将列表倒序。 假设第一个栈 s1 [1,2,3],第二个栈 s2 [] 。若循环…

外卖点餐多门店商家积分商城小程序开发

开源版的点餐外卖多门店多商家积分商城小程序是一款集合了多种功能于一身的移动应用。以下是该小程序的核心功能概述: 点餐与外卖服务:用户能够轻松浏览不同门店的菜单,根据个人口味和需求挑选菜品、口味和规格,并将其加入购物车…

高通QNX基线编译原理

下面代码以高通智驾平台为例。 1 QNX应用程序编译原理 在高通提供的qnx开发包中,qnx的内核已经由qnx所提供,所以qnx的编译,其实就是大量应用程序的编译,以及最后利用buildfile文件,把内核,库文件以及应用程序打包在一起的过程。 1.1 qnx的工程目录 应用程序的编译,可…

AirPods Pro 2 耳机推送新固件,苹果Find My功能助力产品成长

苹果公司面向 AirPods Pro 2(包括 USB-C 和 Lightning 版本),推出了全新的测试版固件更新,版本号为 6E188,高于 12 月份发布的 6B34 固件。 苹果和往常一样,并没有提供详细的更新日志或者说明&#xff0c…

mirthConnect忽略HTTPS SSL验证

mirthConnect SSL忽略验证 1、下载https网站证书 点击不安全---->证书无效 2、查看mirth 秘钥库口令 在mirthConnect 的conf目录下面keystore.storepass 3、导入证书到本地 在jdk的bin目录下面执行 keytool -importcert -file "下载的网站证书路径" -keysto…

MyBatisPlus(SpringBoot版)的分页插件

目录 一、前置工作: 1.整体项目目录结构 2.创建普通javamaven项目。 3.导入依赖,改造成springboot项目 4.配置启动类 5.创建service接口及其实现类 6.创建接口Mapper 7.配置数据源 8.创建数据库表 二、使用MP(mybatisplus)的分页插件 二、使…

高维中介数据: 联合显着性(JS)检验法

摘要 中介分析在流行病学和临床试验中越来越受到关注。在现有的中介分析方法中,流行的联合显着性(JS)检验会产生过于保守的 I 类错误率,因此功效较低。但是,如果在使用 JS 测试高维中介假设时,可以准确控制…

一站式电商数据采集API接口-支持多平台采集-全面提升数据采集效率!

电商数据采集API接口包含:淘宝采集,天猫采集,拼多多采集,同行店采集,蓝海店铺采集,批量整店采集,蓝海监控上新,首销尾销,潜力款选品,上新品采集,高…