当前位置: 首页 > news >正文

前端:你不知道的async await

1.先抛出一个场景:

你是否在日常开发中经常使用类似代码?

async function getXXList () {const result = await this.getArrListApi({page:1,id:2})this.arr = result.data.listconsole.log('结果是…', this.arr)……………………其他逻辑代码
}
1.1 问题

那你是否知道async是什么?作用是什么?await是什么执行逻辑是怎样的?await下面的代码是什么样的执行顺序?

1.2 再举一个实际开发会碰到的业务场景:

页面上有一个下拉框,下拉框的选择项数据是页面一加载就向后端请求的,而与此同时,另外一个接口也是页面一加载就发起请求,但是需要携带下拉项的数据,那么我们想法是等待下拉接口数据返回后,我们再把下拉选择的数据给另外一个接口,也就是说需要等待前一个接口数据返回后,再发起另外一个请求。

让我们带着一些疑问看下面的文章,相信你会有一个满意的答案

1.3 模拟向后端请求数据看代码执行时机

模拟向后端请求数据

2. 换一个角度看async await

ES7推出了两个关键字asyncawait,用于更加优雅的表达Promise
async 函数是什么?一句话,它就是 Generator 函数的语法糖。

说白了,能用async await的地方也能用promise的链式写法,反之也是一样

通过上面的动图,我们可以发现,await后面的代码会等待promise状态完成后才会执行,具体的执行逻辑是,await后面的代码相当于then的回调,也就是微任务,加入微任务队列,然后js继续执行其他代码,等到同步任务执行完了再去微任务队列取出来(先进先出原则),再强调一点,await后面的代码相当于promise的成功回调then方法,可能有的同学好奇了,那错误的处理程序呢? 其实是try catch

async function getXXList () {const result = await this.getArrListApi({page:1,id:2})this.arr = result.data.listconsole.log('结果是…', this.arr)……………………其他逻辑代码
}
----------------以上代码可以等价于下面的代码------------------------------
function getXXList () {const result = new promise((resolve,reject)=>{return this.getArrListApi({page:1,id:2})}).then((result)=>{this.arr = result.data.listconsole.log('结果是…', this.arr)……………其他逻辑代码}) }

3. async await 的错误处理是try catch await 后面的相当于then成功的回调

4. async

async关键字用于修饰函数,被它修饰的函数,一定返回Promise
async 1 = promise.resolve(1) //这是伪代码
async function method1(){return 1; // 该函数的返回值是Promise完成后的数据
}method1(); // Promise { 1 }async function method2(){return Promise.resolve(1); // 若返回的是Promise,则method得到的Promise状态和其一致
}method2(); // Promise { 1 }async function method3(){throw new Error(1); // 若执行过程报错,则任务是rejected
}method3(); // Promise { <rejected> Error(1) }


5. await

await关键字表示等待某个Promise完成,它必须用于async函数中
async function method(){const n = await Promise.resolve(1);console.log(n); // 1
}// 上面的函数等同于
function method(){return new Promise((resolve, reject)=>{Promise.resolve(1).then(n=>{console.log(n);resolve(1)})})
}
5.1 await也可以等待其他数据
async function method(){const n = await 1; // 等同于 await Promise.resolve(1)
}

5.2 如果需要针对失败的任务进行处理,可以使用try-catch语法

async function method(){try{const n = await Promise.reject(123); // 这句代码将抛出异常console.log('成功', n)}catch(err){console.log('失败', err)}
}method(); // 输出: 失败 123

6.练习

// 完成delay函数
// 该函数可以等待一段指定的时间
// 返回Promise
function delay(duration) {return new Promise((resolve, reject) => {setTimeout(() => {resolve();}, duration);});
}// 利用delay函数,等待3次,每次等待1秒,每次等待完成后输出ok
// 等待1秒->ok->等待1秒->ok->等待1秒->ok(async () => {for (let i = 0; i < 3; i++) {await delay(1000);console.log('ok');}
})();// delay(1000)
//   .then(() => {
//     console.log('ok');
//     return delay(1000);
//   })
//   .then(() => {
//     console.log('ok');
//     return delay(1000);
//   })
//   .then(() => {
//     console.log('ok');
//   });

相关文章:

前端:你不知道的async await

1.先抛出一个场景&#xff1a;你是否在日常开发中经常使用类似代码&#xff1f;async function getXXList () {const result await this.getArrListApi({page:1,id:2})this.arr result.data.listconsole.log(结果是…, this.arr)……………………其他逻辑代码 }1.1 问题那你是…...

c#前端实现对pcl点云颜色根据强度特征动态变化突出指定对象

前言 本文主要介绍如何使用c# winform对点云颜色根据点云强度信息对显示的点云颜色进行动态调整。 目的是根据强度信息采用不同的颜色特征突出不同的物体。 一、点云强度是什么&#xff1f; 点云强度又可以叫做反射率&#xff0c; 通常常见的点云格式包括&#xff1a;以pcl为…...

如何制定达人营销策略

如今&#xff0c;达人营销不再是一个新兴趋势&#xff0c;而是公司整个数字营销战略的一部分。虽然十年前&#xff0c;达人还不存在&#xff0c;但随着公司对数字化营销依赖度地提升&#xff0c;各个领域的大V群体逐渐壮大&#xff0c;越来越多的公司已经采用了达人营销策略。如…...

100种思维模型之三层解释思维模型-020

很多人认为&#xff0c;世界首富巴菲特的日子很轻松&#xff0c;因为他想要什么就可以买什么。 所以&#xff0c;人人都学巴菲特&#xff0c;但很多人不知道学习他什么…… 润米咨询董事长刘润老师在2020年干了这样一件事情&#xff1a;向100个不认识的人学习。如&#xff0c;向…...

RK系列(RK3568) i2s 音频输入 麦克风驱动

平台&#xff1a;Android12SOC&#xff1a;RK3568外围芯片&#xff1a;XS9922i2s简介&#xff1a;从上图看I2s主要的线有&#xff1a;SDO SCLK LRCK MCLK I2S协议只定义三根信号线&#xff1a;串行时钟信号SCLK(BCLK)、数据信号SD和左右声道选择信号WS。&#xff08;1&#xff…...

Python|Pymol的安装

​Pymol的使用其实可以分为两种&#xff0c;一种是GUI图形操作界面&#xff0c;直接可以去Pymol官网上下&#xff0c;另一种则是使用API的方式直接调用&#xff0c;适合写脚本批量处理一些东西。建议画图&#xff0c;看结构直接用GUI&#xff0c;但是计算RMSD啥的&#xff0c;用…...

Mysql中关于查询日志的配置详解

查询日志 MySQL中的查询日志保存在文本文件中&#xff0c;能够记录MySQL中的所有数据操作。 开启查询日志 MySQL默认情况下没有开启查询日志&#xff0c;如果需要开启查询日志&#xff0c;则需要在 my.cnf 文件或者 my.ini 文件的 [mysqld] 选项下进行配置。例如&#xff0c;…...

外包整整干了一年,废了。。。

先说一下自己的个人情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了…...

内网渗透(五十六)之域控安全和跨域攻击-非约束委派攻击

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…...

初阶C语言——指针【详解】

文章目录1.指针是什么2.指针和指针类型2.1 指针的解引用2.2 指针 -整数3.野指针3.1 野指针成因3.2 如何规避野指针4. 指针运算4.1 指针-整数4.2 指针-指针4.3 指针的关系运算5. 指针和数组6. 二级指针7. 指针数组1.指针是什么 指针理解的2个要点&#xff1a; 指针是内存中一个最…...

MySQL tinyint(1) 、int(32) 与 varchar(255) 长度含义不同

MySQL tinyint(1) 、int(32) 与 varchar(255) 长度含义不同 发现 tinyint(1)&#xff0c;int(32) 和 varchar(255) 这里面的数字的含义是不同的。 先说数字类型 tinyint 和 int 等 他们能存储的字节大小是与类型绑定的&#xff0c;即定义了 tinyint 或者 int 就确定了能存储…...

搜索旋转排序数组、路径总和 II、拆分数字

文章目录搜索旋转排序数组&#xff08;数组、二分查找&#xff09;路径总和 II&#xff08;树、深度优先搜索&#xff09;拆分数字&#xff08;算法&#xff09;搜索旋转排序数组&#xff08;数组、二分查找&#xff09; 整数数组 nums 按升序排列&#xff0c;数组中的值 互不…...

QT自绘标题和边框

在QT中如果想要自绘标题和边框&#xff0c;一般步骤是&#xff1a; 1&#xff09; 在创建窗口前设置Qt::FramelessWindowHint标志&#xff0c;设置该标志后会创建一个无标题、无边框的窗口。 2&#xff09;在客户区域的顶部创建一个自绘标题栏。 3&#xff09;给窗口绘制一个背…...

数据库浅谈之 LLVM

数据库浅谈之 LLVM HELLO&#xff0c;各位博友好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 这里是数据库浅谈系列&#xff0c;收录在专栏 DATABASE 中 &#x1f61c;&#x1f61c;&#x1f61c; 本系列阿呆将记录一些数据库领域相关的知识 &#x1f3c…...

Unable to connect to Redis无法连接到Redis

文章目录项目场景&#xff1a;问题描述原因分析&#xff1a;解决方案&#xff1a;项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 在某个项目中的提交按钮不好用 org.springframework.data.redis.RedisConnectionFailureException: Unable to con…...

Feign、Ribbon、Hystrix

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;Feign、Ribbon、Hystrix ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林在…...

SpringCloud - Nacos注册发现

目录 服务注册到Nacos 服务分级存储模型 NacosRule负载均衡 服务实例的权重设置 环境隔离 Nacos与Eureka的对比 添加Nacos配置 微服务配置拉取 配置热更新 多环境配置共享 服务注册到Nacos 1.在父工程引入SpringCloudAlibaba的依赖 2.注释掉order-service和user-ser…...

Socket编程、协议理解

Socket编程、协议理解简单说明Socket编程Socket 常用接口Socket服务端业务编码代码说明文件服务(fileServe)消息服务(msgServe)消息写会(writeResponse)注意事项Socket客户端业务编码代码说明总结RYP协议&#xff1a;基于TCP/IP协议之上的自定义协议Rocky Protocol。 协议用途&…...

Idea集成码云

1&#xff1a;Idea集成码云1.1&#xff1a;IDEA安装码云插件【第一步】Idea 默认不带码云插件&#xff0c; 我们第一步要安装 Gitee 插件。如图所示&#xff0c; 在 Idea 插件商店搜索 Gitee&#xff0c;然后点击右侧的 Install 按钮。安装成功后&#xff0c;重启 Idea。Idea 重…...

并发编程学习篇ReentrantLock设计思想剖析

一、AQS原理剖析 什么是AQS java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为&#xff0c;比如 等待队列、条件队列、独占获取、共享获取等而这些行为的抽象就是基于AbstractQueuedSynchronizer&#xff08;简称AQS&#xff09;实现的&#xff0c;AQS是一…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...

起重机起升机构的安全装置有哪些?

起重机起升机构的安全装置是保障吊装作业安全的关键部件&#xff0c;主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理&#xff1a; 一、超载保护装置&#xff08;核心安全装置&#xff09; 1. 起重量限制器 功能&#xff1a;实时监测起升载荷&a…...