async、await详解

article/2025/9/14 9:37:39

一、async/await是什么?

简而言之, async用于申明一个function是异步的;
而await则可以认为是 async await的简写形式,是等待一个异步方法执行完成的。

二、async和await的基础使用

async/awiat的使用规则:

  • async 表示这是一个async函数, await只能用在async函数里面,不能单独使用
  • async 返回的是一个Promise对象,await就是等待这个promise的返回结果后,再继续执行
  • await 等待的是一个Promise对象,后面必须跟一个Promise对象,但是不必写then(),直接就可以得到返回值

三、async/await的特点

1、Async作为关键字放在函数前面,普通函数变成了异步函数
2、异步函数async函数调用,跟普通函数调用方式一样。在一个函数前面加上async,变成 async函数,异步函数,return:1,打印返回值,
3、返回的是promise成功的对象,
4、Async函数配合await关键字使用

案例:

模拟出一个摇色子的异步操作,先通过一个方法三秒之后拿到一个筛子数,第二步进行输出

//基本用法的async函数
let asyncFun = async function(){return 1
}
console.log(asyncFun())
//会返回一个promise对象//使用场景
//摇色子方法
function dice(){return new Promise((resolve,reject)=>{let sino = parseInt(Math.random()*6+1)  //生成一个1~6之间的随机小数setTimeout(()=>{resolve(sino)},2000)})
}
//异步方法async function text(){let n= await dice()//await 关键字后面调用摇色子方法执行完毕之后,才进行变量赋值console.log("摇出来"+n)  //最后打印出摇出来的数}
text()

上面这段代码async中使await 摇色子()先执行,等到三秒后执行完再把得到的结果赋值给左边的n,也就是说test函数需要三秒钟才执行完成,所以test函数是异步的,因此前面必须写async

四、async/await的优点

  1. 方便级联调用:即调用依次发生的场景;
  2. 同步代码编写方式:Promise使用then函数进行链式调用,一直点点点,是一种从左向右的横向写法;async/await从上到下,顺序执行,就像写同步代码一样,更符合代码编写习惯;
  3. 多个参数传递:Promise的then函数只能传递一个参数,虽然可以通过包装成对象来传递多个参数,但是会导致传递冗余信息,频繁的解析又重新组合参数,比较麻烦;async/await没有这个限制,可以当做普通的局部变量来处理,用let或者const定义的块级变量想怎么用就怎么用,想定义几个就定义几个,完全没有限制,也没有冗余工作;
  4. 同步代码和异步代码可以一起编写:使用Promise的时候最好将同步代码和异步代码放在不同的then节点中,这样结构更加清晰;async/await整个书写习惯都是同步的,不需要纠结同步和异步的区别,当然,异步过程需要包装成一个Promise对象放在await关键字后面;
  5. 基于协程:Promise是根据函数式编程的范式,对异步过程进行了一层封装,async/await基于协程的机制,是真正的“保存上下文,控制权切换……控制权恢复,取回上下文”这种机制,是对异步过程更精确的一种描述;
  6. async/await是对Promise的优化:async/await是基于Promise的,是进一步的一种优化,不过在写代码时,Promise本身的API出现得很少,很接近同步代码的写法

五、使用场景

async主要来处理异步的操作,
需求:执行第一步,将执行第一步的结果返回给第二步使用。在ajax中先拿到一个接口的返回数据,后使用第一部返回的数据执行第二步操作的接口调用,达到异步操作。

六、Vue项目案例


普通案例promise:

methods: {getLocation(phoneNum) {return axios.post('/one接口', {phoneNum})},    getFaceList(province, city) {return axios.post('/two接口', {province,city})},  getFaceResult () {this.getLocation(this.phoneNum).then(res => {if (res.status === 200 && res.data.success) {let province = res.data.obj.province;let city = res.data.obj.city;this.getFaceList(province, city).then(res => {if(res.status === 200 && res.data.success) {this.faceList = res.data.obj}})}}).catch(err => {console.log(err)})     }
}

这时你看到了then 的链式写法,有一点回调地域的感觉。现在我们在有async/ await 来改造一下。

async/ await案例:

首先把 getFaceResult 转化成一个async 函数,就是在其前面加async, 因为它的调用方法和普通函数的调用方法是一致,所以没有什么问题。然后就把 getLocation 和getFaceList 放到await 后面,等待执行, getFaceResult 函数修改如下:

async getFaceResult () {let location = await this.getLocation(this.phoneNum);if (location.data.success) {let province = location.data.obj.province;let city = location.data.obj.city;let result = await this.getFaceList(province, city);if (result.data.success) {this.faceList = result.data.obj;}}}

现在代码的书写方式,就像写同步代码一样,没有回调的感觉,非常舒服。

现在就还差一点需要说明,那就是怎么处理异常,如果请求发生异常,怎么处理? 它用的是try/catch 来捕获异常,把await 放到 try 中进行执行,如有异常,就使用catch 进行处理。

async getFaceResult () {try {let location = await this.getLocation(this.phoneNum);if (location.data.success) {let province = location.data.obj.province;let city = location.data.obj.city;let result = await this.getFaceList(province, city);if (result.data.success) {this.faceList = result.data.obj;}}} catch(err) {console.log(err);}}

Vue项目案例(封装)

http.js


'use strict'import axios from 'axios'
import qs from 'qs'axios.interceptors.request.use(config => {// loadingreturn config
}, error => {return Promise.reject(error)
})axios.interceptors.response.use(response => {return response
}, error => {return Promise.resolve(error.response)
})function checkStatus (response) {// loading// 如果http状态码正常,则直接返回数据if (response && (response.status === 200 || response.status === 304 || response.status === 400)) {return response// 如果不需要除了data之外的数据,可以直接 return response.data}// 异常状态下,把错误信息返回去return {status: -404,msg: '网络异常'}
}function checkCode (res) {// 如果code异常(这里已经包括网络错误,服务器错误,后端抛出的错误),可以弹出一个错误提示,告诉用户if (res.status === -404) {alert(res.msg)}if (res.data && (!res.data.success)) {alert(res.data.error_msg)}return res
}export default {post (data,url) {return axios({method: 'post',url: url,data: qs.stringify(data),timeout: 10000,headers: {'X-Requested-With': 'XMLHttpRequest','Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}}).then((response) => {return checkStatus(response)})},get (url, params) {return axios({method: 'get',baseURL: 'https://cnodejs.org/api/v1',url,params, // get 请求时带的参数timeout: 10000,headers: {'X-Requested-With': 'XMLHttpRequest'}}).then((response) => {return checkStatus(response)}).then((res) => {return checkCode(res)})}
}

api.js

export default {getCode: 'http://127.0.0.1:8888/.....'
}

auth.vue

import http from '../../utils/http'
import api from '../../utils/api'methods: {fetchData: async function () {var that = thisvar code = Store.fetchYqm();let params = {inviteCode: code}const response = await http.post(params,api.getCode)var resJson = response.data;}
}

公司的项目案例

在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/1CfMgysw.shtml

相关文章

理解异步函数async和await的用法

定义 1. async 是异步的意思,await则可以理解为 async wait。所以可以理解async就是用来声明一个异步方法,而 await是用来等待异步方法执行 2. async作为一个关键字放在函数前面,表示该函数是一个异步函数,异步函数意味着该函数的…

(一)概述:NGS测序在病原微生物检测中的应用

❝ NGS 技术在临床上的应用逐步趋于成熟,从早期的肿瘤基因检测,到如今大热的微生物病原核酸检测,NGS 技术以其快速、准确和高分辨率的特点,发挥着无可替代的作用。 ❞ 微生物在地球上无处不在,从陆地到海洋&#xff0c…

肿瘤NGS测序公司生信工程师水平划分

生信工程师能力划分 1、大头兵(1)初级生信工程师工作职责任职要求 (2)中级生信工程师工作职责任职要求 (3)高级生信工程师工作职责任职要求 2、主管/经理职位描述任职要求 3、总监参考资料: 去年…

NGS数据分析实践:04. 准备测序数据

NGS数据分析实践:04. 准备测序数据 文接上篇:NGS数据分析实践:03. 涉及的常用数据格式[5] - vcf格式 本次NGS数据,采用多重PCR靶向扩增子测序技术,在Illunima Hiseq X Ten测序平台上进行双末端(paired-end…

NGS_panel的CAP认证学习笔记

对于基因的定义总体可以划分为两类 GAD: Gene associated with Mendelian disorder; GADs include genes that meet criteria for definitive, strong, or moderate evidence for association with disease as described by ClinGenGUS: Gene of uncertain significance; GUSs …

45万例患者基因检测显示:NGS很难检测出七分之一的致病变异

基于下一代测序(NGS)的临床基因测试越来越多地用于辅助诊断,针对该技术的临床应用有具体的指南,除了检测相对可靠的单核苷酸变异(SNVs)和微小插入缺失(indel),NGS也已经被…

R实战 | NGS数据时间序列分析(maSigPro)

masigpro 跟着Cell学作图 | 6.时间序列分析(Mfuzz包) 一个答疑教程。 maSigPro 流程 示例数据 #BiocManager::install(maSigPro) library(maSigPro) # 载入示例数据 data(data.abiotic) data.abiotic[1:5,1:5] data(edesign.abiotic) head(edesign.abiotic) > data.abiotic…

NGS数据分析实践:03. 涉及的常用数据格式[5] - vcf格式

NGS数据分析实践:03. 涉及的常用数据格式[5] - vcf格式 6. vcf格式6.1 vcf格式整体描述6.2 第8列INFO详解6.3 第9列FORMAT详解6.4 vcf文件简单解读 系列文章: 二代测序方法:DNA测序之靶向重测序 NGS数据分析实践:00. 变异识别的基…

生信小白学习日记Day4Day5——NGS基础 NGS分析注释(BWA软件)

2019年5月30日,晚上,心情变好,好几天没更新了,看到男朋友在学一款软件,我也近朱者赤,来继续注释Day2-2中NGS分析流程中的一个重要软件——BWA NGS基础 NGS分析注释 BWA 对应于NGS分析流程的这两步&…

NGS数据分析实践:00. 变异识别的基本流程

NGS数据分析实践:00. 变异识别的基本流程 变异识别过程可以分成3大块:1. 原始数据质控;2. 数据预处理;3. 变异识别。大致可以细分为6个部分:(1) 原始测序数据的质控;(2) read比对,排序和标记PCR…

如何用软件模拟NGS数据

如何用软件模拟NGS数据 为了评价一个工具的性能,通常我们都需要先模拟一批数据。这样相当于有了参考答案,才能检查工具的实际表现情况。因此对于我们而言,面对一个新的功能,可以先用模拟的数据测试下不同工具的优缺点。有如下几个…

生信小白学习日记Day2——NGS基础 illumina高通量测序原理

2019年5月26日,周日,小雨 说明:阅读生信宝典和查阅文章的总结,原文请关注公众号生信宝典,参考的博文都附有链接,仅供参考。 生信宝典 NGS基础——高通量测序原理 本文介绍了测序文库构建原理、链特异性文…

NGS数据分析实践:05. 测序数据的基本质控 [2] - MultiQC

NGS数据分析实践:05. 测序数据的基本质控 [2] - MultiQC 2. MultiQC2.1 帮助信息及运行代码2.2 报告解读2.3 小结 文接上篇:NGS数据分析实践:05. 测序数据的基本质控 [1] - FastQC 2. MultiQC NGS技术的进步催生了新的实验设计、分析类型和极…

NGS数据分析实践:03. 涉及的常用数据格式[2] - sam/bam格式

NGS数据分析实践:03. 涉及的常用数据格式[2] - sam/bam格式 2. sam和bam格式 系列文章: 二代测序方法:DNA测序之靶向重测序 NGS数据分析实践:00. 变异识别的基本流程 NGS数据分析实践:01. Conda环境配置及软件安装 NGS…

NGS数据过滤之trimmomatic

NGS 原始数据过滤对后续分析至关重要,去除一些无用的序列也可以提高后续分析的准确率和效率。Trimmomatic 是一个功能强大的数据过滤软件。 Trimmomatic 介绍 Trimmomatic 发表的文章至今已被引用了 2810 次,是一个广受欢迎的 Illumina 平台数据过滤工具…

NGS基础:测序原始数据批量下载

生物或医学中涉及高通量测序的论文,一般会将原始测序数据上传到公开的数据库,上传方式见测序文章数据上传找哪里;并在文章末尾标明数据存储位置和登录号,如 The data from this study was deposited in NCBI Sequence Read Archive under acc…

NGS之数据格式

生物信息中常见的几种数据格式有:fasta、fastq、bam、sam、vcf、bed、gff。 参考:http://www.biotrainee.com/thread-42-1-1.html FASTQ 参考:https://en.wikipedia.org/wiki/FASTQ_format fastq格式是文本格式。它有对应序列字符的质量分数&#xff…

生信小白学习日记Day3——NGS基础 NGS分析注解(质量分析软件)

2019年5月27日,天气舒适,忙碌一天之后开始今天的生信学习。今天就昨天Day2-2的一些标记加以查询说明,仅供参考。 NGS基础 NGS分析注解 1. 质量分析软件 昨天提到,拿到数据后可以通过一些软件来评估测序质量的好坏,…

NGS 数据过滤之 Trimmomatic

NGS Trimmomatic 支持多线程,处理数据速度快,主要用来去除 Illumina 平台的 Fastq 序列中的接头,并根据碱基质量值对 Fastq 进行修剪。软件有两种过滤模式,分别对应 SE 和 PE 测序数据,同时支持 gzip 和 bzip2 压缩文…

NGS基础名词解释(1)

什么是高通量测序? 高通量测序技术( High-throughput sequencing , HTS )是对传统 Sanger 测序(称为一代测序技术)革命性的改变 , 一次对几十万到几百万条核酸分子进行序列测定 , 因此在有些文献中称其为…