公司新的项目中我用了async await来写异步的调用接口函数,在这里记录一下我的理解、遇到的问题和解决的方法。
async和await
- async:它修饰的方法,返回的数据就会是个promise对象(可单独使用)
- await:意思是等待执行完它修饰的方法,再往下执行,它会阻塞后面的代码,也就是同
- await 如果得到的是 Promise 对象,则得到其 resolve值,需要配合async使用
关键点:
- async/await 本质上依然是基于Promise,但在使用上更加简便符合自然习惯。
- async函数内部同步执行。await之间相当于.then。
- async函数外部的调用异步执行。
- 需要try/catch await应对promise reject的情况。
异常捕获
运行的代码放在try中,如果try中接口挂了,或者赋值失败,空数组循环……只要出现一个错误,都会走到catch,但是接口什么的仍然可能已经走通了。所以报错时要好好看看,到底是什么的错误。
async getExamineRisk () {
// 获取风险等级
try {
let res = await this.api.getExamineRisk()
if (res.data.code === 0) {
this.examineRisk = res.data.data
}
} catch (error) {
this.$message.error('操作失败!')
}
},
外部调用async方法
async函数外部的调用异步执行。所以外部调用时仍有可能先走赋值等同步操作,之后在调用async函数,但是赋值的数据可能就来自于async函数,这就会导致赋值为空。此时应该在函数名前再加一个async,在调用的异步方法前加await,此时异步方法已经是同步的顺序了,再把赋值操作放在调用的方法之后,可得到想要的结果。
async getExamineFetchList (data = this.pageparam) {
// 获取list数据
try {
let res = await this.api.getExamineFetchList(data)
this.secenList = res.data.data.data.list
this.total = res.data.data.data.total
// this.total = this.secenList.length
console.log(res)
} catch (error) {
this.$message.error('获取列表失败!')
}
},
async getExDetail (item) {
// 场景介绍(根据场景id获取场景详情)
try {
let res = await this.api.getExDetail({ sceneId: item.sceneId })
this.currentSecen = res.data.data
} catch (error) {
this.$message.error('操作失败!')
}
},
async tostep1 (item) {
console.log('复用', item)
await this.getSTsceneTask(item)
await this.getExDetail(item)
let data = this.taskData.data
this.task = data
this.addform.taskName = data.taskName
this.targetscheckList = data.taskTargets
this.TGparamList = data.targetParameters
this.executeCycle = data.executeCycle
this.filterF.taskTargets = data.filters
this.sendstaffs = data.emailSends
if (data.emailSends) {
for (let index = 0; index < data.emailSends.length; index++) {
this.sendstaffs[index].staffId = data.emailSends[index].receiveStaffId
this.sendstaffs[index].staffName =
data.emailSends[index].receiveStaffName
}
}
console.log(data, 751)
this.stepState = 'step1'
this.stepVisible = true
}