前端(十二)——深入理解和使用 async和await

news2024/12/28 17:58:30

在这里插入图片描述

😛博主:小猫娃来啦
😛文章核心:深入理解和使用 async和await

在 JS中,异步操作是无法避免的,而处理异步操作最常用的方法是使用回调函数或者 Promise。然而,自 ES2017 引入了 async/await 之后,我们可以通过更简洁、可读性更好的方式来处理异步代码。本文将从浅层次到深层次,介绍 async/await 的理解和使用。

文章目录

  • 你可能遇到的问题
  • 什么是 async/await
  • 基本用法
  • 错误处理
  • 并行执行多个异步操作
  • async/await 与同步代码混用
  • axios 和 Promise 的相同点
  • 总结

你可能遇到的问题

声明一个变量,用axios请求后,把请求结果中的数据给这个变量。然后去使用这个变量,发现这个变量里是空的。但是当把这个这串代码放在定时器里几秒后,就能打印到。但如果网络不好,请求花的时间更多,那么你还是打印不到。你遇到过这个情况吗?如何拿到值呢?或者如何等到接口请求完,再去向下执行?

这边牵扯到一个同步和异步的问题,那么axios是异步的非阻塞模式。如何将axios请求由异步变为同步,这就需要asyncawait配合使用。

做到这一点,你才能保证必须让程序按照从上到下的顺序执行,你也就能拿到值了。

async function init() {
  let salesData = [];
  
  const res = await axios({
    method: "post",
    url: "要请求的接口",
    data: {}
  });

}
 console.log(res.data.data);
 salesData = res.data.data;
  

如果你着急解决问题,那么上面的代码示例就已经帮你解决了问题。如果你有时间,要深入了解,那么请往下看:


什么是 async/await

async/await 是基于 Promise 的一种语法糖,它提供了一种更优雅的方式来编写异步代码。通过使用 async 关键字声明一个异步函数,我们可以在其中使用 await 关键字等待 Promise 对象的解决(resolved)或拒绝(rejected),使得代码看起来更像是同步的方式进行编写和阅读。


基本用法

  1. async 声明 使用 async 关键字声明一个异步函数。异步函数内部可以包含 await 表达式。
async function fetchData() {
  // 异步操作
}
  1. await 表达式 在异步函数内部,可以使用 await 关键字等待一个 Promise 对象,并返回其 resolved 的结果。这样,在 await 表达式之后的代码将会等待该 Promise 对象解决,然后继续执行。
async function fetchData() {
  const result = await somePromise; // 等待 Promise 对象执行完毕
  console.log(result); // 输出已解决的结果
}

await后面放axios也是可以的,原因无他。

仅因为axios 是一个基于 Promise 的 HTTP 客户端库,它提供了更丰富、更方便的功能来发送 Ajax 请求和处理响应。而 Promise 则是一种通用的处理异步操作的对象,可以在各种场景下使用,并通过链式调用的方式来处理异步操作的结果。


错误处理

  1. 通过将 await 表达式放在 try-catch 块中,可以捕获异步操作抛出的错误,并进行相应的处理。
async function fetchData() {
  try {
    const result = await somePromise;
    console.log(result);
  } catch (error) {
    console.error(error);
  }
}
  1. 在 async 函数内部,如果需要抛出一个错误并将其封装为 Promise.reject(),可以使用 throw 关键字。
async function fetchData() {
  throw new Error('请求失败');
}

并行执行多个异步操作

  • 若有多个独立的异步操作,我们可以使用 Promise.all() 方法来并行执行它们,并等待所有异步操作都完成后获取结果。
async function fetchMultipleData() {
  const promise1 = fetch(url1);
  const promise2 = fetch(url2);
  
  const [result1, result2] = await Promise.all([promise1, promise2]);
  console.log(result1, result2);
}

async/await 与同步代码混用

  1. 同步代码中使用 await 在一个异步函数内部,我们可以使用 await 关键字来等待异步操作的结果,但是也可以将其用于同步操作,使得代码逻辑更加清晰。
async function doSomething() {
  const result = await syncFunction(); // 等待一个同步函数执行完毕
  console.log(result);
}
  1. async 函数调用 我们可以在同步代码中调用异步函数,虽然这样的调用本身是异步的,但我们可以将它视为一个同步操作,并根据需要等待其结果。
function syncFunction() {
  const result = await asyncFunction(); // 等待一个异步函数执行完毕
  console.log(result);
}

axios 和 Promise 的相同点

  • 异步操作:无论是 Axios 还是 Promise,它们都用于处理异步操作。Axios 通过发送 HTTP 请求和处理响应来实现异步操作,而 Promise 是一种通用的处理异步操作的对象,可以在各种场景下使用。

  • 基于 Promise:Axios 是基于 Promise 的,它返回的是一个 Promise 对象。Promise 提供了一种更优雅、可读性更好的方式来处理异步代码。

  • 错误处理:无论是 Axios 还是 Promise,它们都提供了错误处理的机制。Axios 可以捕获请求错误和响应错误,并将错误信息封装成一个统一的错误对象返回。Promise 通过 reject 状态来表示异步操作失败,并能够使用 .catch() 方法来捕获并处理错误。


总结

当我们遇到需要代码加载顺序必须同步时,也就是执行顺序必须由上而下,等中间代码执行完毕才能向下执行时。
我们需要用async和await来介入,他们的配合使用,可以使异步变为同步,多用于改变接口请求等异步操作。

在这里插入图片描述


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

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

相关文章

分布式版本控制系统(一)

分布式版本控制系统(一) 目录 分布式版本控制系统(一) 1、Git、Github、Gitlab 的区别2、Git 与 SVN 区别3、Git工作流程4、Git基本概念5、Git 客户端安装使用 5.1 git-server安装配置5.2 git-client配置免密登录git服务器5.3 文本编辑器5.4 差异分析工具5.5 查看配置信息5.6 常…

clip模型学习

先介绍几个相关概念: 1.零样本学习(zero-shot) 参考:https://blog.csdn.net/gary101818/article/details/129108491 利用训练集数据训练模型,使得模型能够对测试集的对象进行分类,但是训练集类别和测试集类…

【枚举】CF1858 B

Problem - B - Codeforces 题意&#xff1a; 思路&#xff1a; 直接枚举是去掉哪个店&#xff0c;然后计算贡献即可 虽然赛时做出来了&#xff0c;但是这种计算还是感觉不熟练 Code&#xff1a; #include <bits/stdc.h>#define int long longusing i64 long long;co…

订货系统怎么选?从这四个方面筛选错不了(一)

选择适合的订货系统对企业来说是一个重要且复杂的决策。一个优秀的订货系统可以提高供应链的运作效率、降低成本&#xff0c;并帮助企业更好地管理库存和订单。如果不知道从那几方面做选择&#xff0c;我们可以简单从四个方面进行筛选&#xff0c;这样一般错不了&#xff0c;今…

【RT-Thread】 启用hash算法软件包

参考文章 哈希匹配算法在单片机上的应用 近来单片机开发因业务需求需要用hash算法&#xff0c;为开启此功能&#xff0c;在RT-Thread Studio环境下操作如下&#xff1a; 1&#xff0c;在RT-Thread Setttings里面的搜索栏里输入hash,然后定位到下图所示 使能hash match for …

四、Controller 配置总结、RestFul 风格

文章目录 一、Controller 配置总结二、RestFul 风格2.1 使用 RequestMapping 的 method 属性指定请求类型 三、扩展&#xff1a;小黄鸭调试法 一、Controller 配置总结 实现 Controller 控制器的方式 实现 Controller 接口&#xff0c;重写 handleRequest 方法实现 控制器实现 …

IDEA常用工具配置

IDEA常用工具&配置 如果发现插件市场用不了&#xff0c;可以设置Http Proxy&#xff0c;在该界面上点击”Check connection“并输入的地址&#xff1a;https://plugins.jetbrains.com/ 。 一、常用插件 1、MybatisX Mybaits Plus插件&#xff0c;支持java与xml互转 2、F…

【数据结构】_7.二叉树概念与基本操作

目录 1.树形结构 1.1 树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的应用—表示文件系统的目录树结构 ​编辑​2.二叉树 2.1 概念 2.2 特殊二叉树 2.3 二叉树的性质 2.4 二叉树的存储结构 2.4.1 顺序存储结构&#xff08;数组存储结构&#xff09; 2.4.2…

小程序数据可视化:使用图表和可视化工具展示数据

在当今信息爆炸的时代&#xff0c;数据无疑是最珍贵的资源之一。然而&#xff0c;海量的数据如果不加以整理和展示&#xff0c;很难从中获取有价值的信息。这时候&#xff0c;数据可视化就发挥了重要作用&#xff0c;它能够通过图表和可视化工具将复杂的数据转化为直观的视觉形…

Azure控制台添加磁盘到VM

在控制台中添加磁盘 RDP方式登录windows虚拟机&#xff0c;打开后提示连接&#xff0c;点击连接&#xff0c;并会指向server manager,点击File and Storage Services,然后点击Disks,并按照提示一步一步操作 3. 最后在我的电脑中可以看到新创建的磁盘

[Go版]算法通关村第十一关白银——位运算的高频算法题

目录 专题1&#xff1a;位移的妙用题目&#xff1a;位1的个数&#xff08;也被称为汉明重量&#xff09;解法1&#xff1a;遍历所有位&#xff0c;判断每个位的数字是否是1Go代码 解法2&#xff1a;依次消除每个1的位 numnum&(num-1)Go代码 题目&#xff1a;比特位计数思路…

春秋云镜 CVE-2020-21650

春秋云镜 CVE-2020-21650 MyuCMS后台rce 靶标介绍 MyuCMS开源内容管理系统,采用ThinkPHP开发而成的社区商城聚合&#xff0c;插件&#xff0c;模板&#xff0c;轻便快捷容易扩展 其2.2版本中admin.php/config/add方法存在任意命令执行漏洞。 启动场景 漏洞利用 exp /index…

以安全促发展——《数据出境安全评估办法》解读

各国关于数据出境的监管要求一直是各国数据监管的风向标&#xff0c;不仅体现国家对于数据安全的重视程度&#xff0c;也能意会出国家对于数据竞争的态度以及数字经济发展的思路。例如欧盟《通用数据保护条例》&#xff08;GDPR&#xff09;设定的个人数据出境的限制&#xff0…

conda常用命令及国内镜像源

conda命令使用介绍 启动conda source ~/.bashrc帮助目录 conda create -h检查conda版本 conda --version升级当前版本的conda conda update conda环境管理 列出所有的环境 conda info -e conda env list安装一个不同版本的python新环境 conda create --name py27 pytho…

有一种新型病毒在 3Ds Max 环境中传播,如何避免?

3ds Max渲染慢&#xff0c;可以使用渲云渲染农场&#xff1a; 渲云渲染农场解决本地渲染慢、电脑配置不足、紧急项目渲染等问题&#xff0c;可批量渲染&#xff0c;批量出结果&#xff0c;速度快&#xff0c;效率高。 此外3dmax支持的CG MAGIC插件专业版正式上线&#xff0c;…

网络通信原理数据链路层数制转换(第四十一课)

数制概述 数制是表示和计算数值的一种方式,不同的数制使用不同的数字和规则来表示数值。最常见的数制是十进制(也称为阿拉伯数字),使用0-9个数字来表示数值。其他常见的数制包括二进制**(使用0和1表示数值)、八进制(使用0-7表示数值)和十六进制(使用0-9和A-F表示数值…

Linux_10_进程、系统性能和计划任务

目录 1 进程和内存管理1.1 什么是进程1.2 进程结构1.3 进程相关概念1.3.1 物理地址空间和虚拟地址空间1.3.2 用户和内核空间1.3.3 C代码和内存布局之间的对应关系1.3.4 进程使用内存问题1.3.4.1 内存泄漏: Memory Leak1.3.4.2 内存溢出: Memory Overflow1.3.4.3 内存不足: OOM …

docker tomcat时间少8小时问题解决

docker容器与系统时间一致并且正确&#xff0c;但是java程序在运行中通过log日志发现发了8小时 解决方法 修改docker容器中tomcat/bin/catalina.sh文件&#xff0c;添加一下内容 JAVA_OPTS"$JAVA_OPTS -Dfile.encodingUTF8 -Duser.timezoneGMT08" 附 操作命令 一…

ue5读取外部文件

准备环境 我的环境是win10&#xff0c;ue5.1.1&#xff0c;cpux86。 创建工程时&#xff0c;需要选择C模式 这样在Content Browser中会出现C Classes文件夹&#xff0c;下面有一个本项目命名的文件夹&#xff0c;鼠标右键可以看到New C Class选项。 新建类的时候选择父类Blue…

7-5 出租车计价

分数 15 全屏浏览题目 切换布局 作者 沈睿 单位 浙江大学 本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下&#xff1a; 起步里程为3公里&#xff0c;起步费10元&#xff1b;超起步里程后10公里内&#xff0c;每公里2元&#xff1b;超过10公里以上…