async、await

article/2025/9/14 8:39:31

词法定义


  • async

    async 是“异步”的简写, async 用于申明一个异步的 function

  • await

    await 可以认为是 async wait 的简写,await 用于等待一个异步方法执行完成。

借检https://www.cnblogs.com/airen123/p/9543490.html

特点:

  1. asayc的用法,它作为一个关键字放到函数前面,这样普通函数就变为了异步函数
  2. 异步async函数调用,跟普通函数的使用方式一样
  3. 异步async函数返回一个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的优点


  1. 方便级联调用:即调用依次发生的场景;

  2. 同步代码编写方式: Promise使用then函数进行链式调用,一直点点点,是一种从左向右的横向写法;async/await从上到下,顺序执行,就像写同步代码一样,更符合代码编写习惯;

  3. 多个参数传递: Promise的then函数只能传递一个参数,虽然可以通过包装成对象来传递多个参数,但是会导致传递冗余信息,频繁的解析又重新组合参数,比较麻烦;async/await没有这个限制,可以当做普通的局部变量来处理,用let或者const定义的块级变量想怎么用就怎么用,想定义几个就定义几个,完全没有限制,也没有冗余工作;

  4. 同步代码和异步代码可以一起编写: 使用Promise的时候最好将同步代码和异步代码放在不同的then节点中,这样结构更加清晰;async/await整个书写习惯都是同步的,不需要纠结同步和异步的区别,当然,异步过程需要包装成一个Promise对象放在await关键字后面;

  5. sync/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/9SMDqGxD.shtml

相关文章

C# 彻底搞懂async/await

关键: 异步方法:在执行完成前立即返回调用方法,在调用方法继续执行的过程中完成任务。 async/await 结构可分成三部分: (1)调用方法:该方法调用异步方法,然后在异步方法执行其任务的…

async、await总结

一、async用法 async作为一个关键字放到函数前面,用于表示函数是一个异步函数。异步函数也就意味着该函数的执行不会阻塞后面代码的执行。 异步函数语法很简单,就是在函数前面加上async 关键字,来表示它是异步的。 那怎么调用呢?a…

async和await

async和await 概念 先从字面意思来理解。async 是“异步”的简写,而 await 可以认为是 async wait 的简写。所以应该很好理解 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。 另外还有一个很有意思的语法规定&#xff0…

被说一知半解,await不懂你别乱用

文章目录 1.前言2.await是否阻塞主线程?3.await是否同步?4.总结 1.前言 这篇文章我是不想写的,因为之前已经写过了(异步回调Async Await与Promise区别),此时此刻的心情是非常的不满,为什么呢&a…

async、await详解

一、async/await是什么? 简而言之, async用于申明一个function是异步的; 而await则可以认为是 async await的简写形式,是等待一个异步方法执行完成的。 二、async和await的基础使用 async/awiat的使用规则: async 表示这是一个a…

理解异步函数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 平台数据过滤工具…