async和await的应用

77 篇文章 7 订阅
18 篇文章 0 订阅

async和await

1. 介绍

什么是async和await

async 和 await 是es7技术,可以简化 Promise 操作,提高 Promise 代码的 阅读性 和 理解性;

async和await结合起来,可以使得异步调用不返回Promise对象,而直接把then回调函数的第一个形参result给返回出来,使得代码更节俭,提高开发效率,也可以保证异步调用的顺序执行、减少回调地狱出现程度。

async和await的作用

  1. 替代then()。
  2. 保证各个异步调用顺序执行,减少回调地狱。

async和await的好处

  1. 代码更节省、结构更清晰、便于阅读和理解。
  2. 提高开发效率。

应用

  • 对3个文件进行读取操作
const fs = require('fs')

// 在Promise内部不要设置"业务逻辑"代码,同时内部需要把promise对象进行return返回
function getContent(filename){
  // resolve:代表异步成功执行的回调函数
  // reject:代表异步失败执行的回调函数
  return new Promise(function(resolve,reject){
    // 异步操作
    fs.readFile(filename,'utf8',function(err,data){
      if(err){return reject('文件错误了:'+err)}
      resolve(data)
    })
  })
}

// 封装一个函数,一并读取3个文件内容
// await:要修饰promise对象,async:要放到await外边最近的function函数前边
// await会把promise对象直接变为then里边的result结果
// async 和 await 会简化Promise对象操作,使得不用调用then或catch方法,代码更节省、更优雅
// 并且可以保证多个异步“顺序”执行,还没有回调“地狱”
// async 和 await 是es7技术
// (es6/2015  es7/2016  es8/2017 es9/2018 es10/2019 es2020 es2021)
async function getThreeContent(){
  console.log( await getContent('./files/03.txt'))
  console.log( await getContent('./files/02.txt'))
  console.log( await getContent('./files/01.txt'))
}
// p1
//  .then(result=>{
//    console.log(result)
//  })
//  .catch(err=>{
//   console.log('错误了'+err)
// })

getThreeContent()

2. 应用

需求

​ 通过async和await升级改造获取频道列表的代码

语法

async function xxx(){
  let rst = await yyy()
}

// xxx函数嵌套调用yyy函数,yyy会返回一个promise对象
// 在xxx前边设置async,在yyy前边设置await
// rst:就是then方法回调函数实参的形参,即下述代码的result
function xxx(){
	let pro = yyy()
	pro
		.then(result=>{xxx})	
}

应用

不使用async和await获取频道的代码:

getChannelList () {
  let pro = this.$http({
    url: '/mp/v1_0/channels',
    method: 'get'
  })
  pro
    .then(result => {
    // console.log(result)
    this.channelList = result.data.data.channels
  })
    .catch(err => {
    return this.$message.error('获得频道失败:' + err)
  })
}

async和await介入应用:

async getChannelList () {
  let result = await this.$http({
    url: '/mp/v1_0/channels',
    method: 'get'
  })
  this.channelList = result.data.data.channels
}

3. 错误处理try/catch

如果axios请求过程中发生错误,可以通过异常机制 try、catch 加以处理,try、catch是 javascript语言本身技术。

语法

try{
  // 放置有可能产生错误的代码
  aa
  bb
  cc
}catch(err){
  // 对try内部的错误进行捕捉处理
  // err:是具体错误对象
  dd
}
ee

// try、catch使用情形分析:
// 1. 没有任何错误,那么执行: a   b   c   e
// 2. try中的b有错误,那么执行:  a   d   e

// 特点:
// try内部:如果有错误,错误后续代码不执行
// 无论是否有错误,try/catch后续代码都会运行,其可以保证流程是"完整"的
//  如果try或catch内部有return,就另当别论了

注意

  1. try/catch根据实际情况进行使用。
  2. 如果没有必要也可以不设置,使得项目代码更简洁、运行速度更快。

应用

async getChannelList () {
    try {
        // 有可能产生错误的代码
        let result = await this.$http({
            url: '/mp/v1_0/channelsabcd',
            method: 'get'
        })
        this.channelList = result.data.data.channels
    } catch (err) {
        // 捕捉错误信息
        this.$message.error('获得频道失败!' + err)
    }
}

注意

  1. try/catch可以保证项目代码"完整"运行,但要设置return就不保证完整了。
  2. 如果对错误有完全的把控,可以去除try/catch机制。

4. async和await其他应用情形

var obj = {
    async getInfo:function(){
        await getXXXX()
        await getXXXX()
    }
}
// 或
function ffff(){
    // async需要设置到Promise对象(await)外层最近function的前边位置
    getInfo(async function(){
        await getXXXX()
        //console.log(getXXXX())
    })
}
// 或
async function XXXX(){
    await getXXXX()
}

注意

  1. async需要设置到Promise对象(await)外边最近的function前边位置。
  2. await必须结合async一并使用。
  3. async可以独立修饰函数使用,返回值是Promise对象(了解)。
  4. 一个async可以对应多个await,并且各个await顺序执行。
  5. await 后面可以跟任何的JS 表达式(字符串、数值),但是修饰 Promise对象 更有意义。
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
async/await适用于所有需要使用异步操作的场景,有些场景中甚至可以取代Promise的使用,使代码更加清晰和易于维护。以下是一些适合使用async/await的场景: 1. 等待Promise对象的执行结果并赋值给变量:使用await关键字可以等待一个Promise对象的执行结果,并将结果赋值给一个变量。这样可以方便地获取异步操作的结果并进行后续处理。 2. 异常处理:在使用async/await时,可以使用try-catch语句来捕获异步操作中可能出现的异常。这样可以方便地处理错误情况,并进行相应的处理。 3. 简化异步编程流程:async/await是一种简洁明了的异步编程方案,它使异步操作看起来和同步代码类似,从而降低了编写异步代码的复杂度和维护成本。它基于Promise对象实现,并使用async和await关键字来简化异步编程的流程。 总结来说,async/await适用于所有需要进行异步操作的场景,可以使代码更加清晰易读,并方便地处理异步操作的结果和异常情况。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [async和await详解](https://blog.csdn.net/m0_63855883/article/details/131066940)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值