// 登录
async login({ commit }, params) {
const loginFormData = new FormData()
Object.keys(params).forEach(key => {
loginFormData.append(key, params[key])
})
const useVCode = 'vcode' in params
try {
// 等待 ajax 请求完成
const res = await axios.post(
`/api/login/with/${useVCode ? 'vcode' : 'password'}`,
loginFormData
)
const data = res.data
if (data.success) {
Message.success('登录成功')
Object.keys(data.data).forEach(key => {
Vue.$cookies.set(key, data.data[key])
})
commit(constants.LOGIN, data.data)
} else {
Message.error(data.message)
}
} catch (err) {
console.log(err)
}
}
在项目的开发过程中用到了 async 函数,如何在调用该函数时捕获 axios 中抛出的错误?
// 登录
onSubmit() {
this.$refs.loginForm.validate(valid => {
if (valid) {
this.loading = true
const params = {
mobile: this.loginForm.mobile,
[this.useVCode ? 'vcode' : 'password']: this.useVCode
? this.loginForm.vCode
: MD5(this.loginForm.password)
}
// 如何在此处捕获 async 函数中 axios 的报错
// 比如说网络原因导致 axios 请求无法完成
// 根据 axios 的报错跳转不同的路由
this.login(params).then(() => {
this.loading = false
this.$refs.loginForm.resetFields()
const back = sessionStorage.getItem('back')
this.$router.push(back)
})
}
})
}
这一段是官方“Handling Errors”的示例,是基于 Promise 的例子:
总体来说,出错分三种情况
error.response
error.request
,并从中获取错误信息示例是基于 Promise 的,但题主的写法是基于 async/await 的,所以需要将
.catch(...)
改为try ... catch ...
写法,即不过题主在
catch ...
代码块中写的是console.log(err)
,错误在login()
内部消化了,那么外面调用login()
的时候就不知道里面是否出错。如果需要知道
login()
里面出了什么问题,有两种方法,一种是在
login()
中不作处理,把问题留给外面来处理,比如另一种方法是在内部处理了之后,将错误信息封装给外面使用