async/await

上周我们写到用回调或者then处理异步操作,这周我们体验一下使用async/await来处理异步

1.什么是async/await?

async是“异步”的意思,async function 声明用于定义一个返回promise对象的异步函数
。而await从字面意思上是“等待”的意思,就是用于等待异步完成。并且await与async是配套使用,即只能在async函数中使用。await得到Promise对象之后就等待Promise接下来的resolve或者reject。

// 
async function asyncFun() {
  return 'hello async'
}
console.log(asyncFun ())
image.png

从上面的返回结果我们可以看到,如果async直接返回的是一个return值,那么他会封装成peomise中的resolved。
若我们就是想要这个返回值怎么办呢?就像上周peomise提到的then用法

async function asyncFun() {
  return 'hello async'
}
asyncFun().then((value) => {
  console.log(value) // hello async
})
image.png

2.实际应用中return返回了一个undefined怎么办?

在一些实际应用中,我们想要把接口请求回来的数据,渲染到页面,并且要执行下一步操作时,我们肯定会想到用异步处理,但是我们不知道请求接口会花费多少时间,万一还没有返回数据,渲染上去的就是undefined,页面肯定会报错。
例子:

async getGroupConfig (val) {
      this.modifyGroup.loading = true
      const url = '/Document/getGroupDetail'
      const finUrl = '/Document/getStaffInfoByCenter'
      try {
        let modifyGroup = this.modifyGroup
        let req = {
          params: {
            id: val
          }
        }
        let {error, msg} = await this.$axios.get(url, req)
        if (error) {
          this.$message.warning(msg)
          return
        }
        modifyGroup.id = msg.id
        modifyGroup.name = msg.name
        modifyGroup.department = msg.centerTree.split(',').map(ele => ele.split('#'))
        modifyGroup.centerId = msg.centerId.split(',')
        modifyGroup.extraStaff = msg.extraStaff.map(ele => ele.staffId)
        modifyGroup.extraStaffOption = msg.extraStaff
        modifyGroup.removeStaff = msg.removeStaff.map(ele => ele.staffId)
        let reqParams = {
          params: {
            centerId: msg.centerId
          }
        }
        let res = await this.$axios.get(finUrl, reqParams)
        if (res.error) {
          this.$message.warning(res.msg)
          return
        }
        modifyGroup.removeStaffOption = res.msg
        this.modifyGroup.loading = false
      } catch (err) {
        this.modifyGroup.loading = false
        console.log(err)
      }
    },

在上面例子我们可以看到,首先是请求‘/Document/getGroupDetail'这个接口,返回的结果作为第二个接口/Document/getStaffInfoByCenter的参数。若返回的是ubdefined,那么在请求第二个接口时必将报错,这是我们就用到await

3.await帮我们做了什么?

首先,await 操作符用于等待一个Promise 对象。它只能在异步函数 async function 中使用。
其次,await是在等待acync函数的完成,其获取到的是一个promise的计算结果,即一个真正的实际返回值。
例如:还是看上面的例子

let {error, msg} = await this.$axios.get(url, req)

4.通过async方法重写 promise 链

上周的promise中,在多个业务中,我们使用多个then进行多次的处理,这样使用起来特别麻烦。

newPromise1().then((data) => {
    console.log(data)
    return newPromise2()
  }).then((data) => {
    throw new Error('Something failed')
    console.log('Do this')
    return newPromise3()
  }).catch(() => {
    console.log('Do what')
  }).then((data) => {
    console.log(data)
  })

但是我们可以通过上面第一个例子中的await写法:

async getGroupConfig (val) {
    let {error, msg} = await this.$axios.get(url, req)
    let res = await this.$axios.get(finUrl, reqParams)
}

5.错误处理

正常:promise正常resolve,那么await返回这个结果
异常:但是在reject的情况下会抛出一个错误

async function getProcessedData(url) {
  let v;
  try {
    v = await downloadData(url); 
  } catch (e) {
    v = await downloadFallbackData(url);
  }
  return processDataInWorker(v);
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容