【发布时间】:2018-07-17 00:44:37
【问题描述】:
我有一些异步代码需要在出错时停止但继续执行:
async saveCoupons({ state, rootState, dispatch, commit }) {
const promises = []
state.userCoupons.forEach(coupon => {
if (coupon.isNew && coupon.isUpdated) {
// if the user is creating a new coupon
promises.push(Vue.axios.post('/api_producer/coupons.json', coupon, { params: { token: coupon.token } }))
} else if (!coupon.isNew && coupon.isUpdated) {
// if the user is updating the coupon
promises.push(Vue.axios.patch(`api_producer/coupons/${coupon.id}/`, coupon, { params: { token: coupon.token } }))
}
})
try {
await Promise.all(promises)
dispatch('utilities/showModal', 'success', { root: true })
dispatch('fetchProducerCoupons')
} catch (err) {
let couponToken = err.request.responseURL.split('token=')[1]
commit('ADD_ERROR_ON_COUPON', couponToken)
console.log(err)
}
}
这就是代码当前的结构,它可以工作,但我意识到这很糟糕。我需要做的是停止执行
dispatch('utilities/showModal', 'success', { root: true })
dispatch('fetchProducerCoupons')
如果其中一个 api 调用失败。我想在 forEach 中捕获错误,所以我已经有了可用的项目,我可以立即将错误添加到它,而不是之后再做(这就是我现在用 { params: { token: coupon.token } } 做的事情。
【问题讨论】:
-
请求需要并行触发还是可以一个接一个地触发?
-
不,这并不重要。只要我可以直接从 forEach 中捕获调用错误,我就可以将错误附加到项目上,然后将其显示在前端。如果它成功了,那么它所做的只是显示成功模式,而不是通过再次获取它们来刷新项目
-
为每个 Promise 调用添加一个 .catch 并将您需要的参数“抛出”到错误处理程序。
-
@LuizChagasJr 它仍然以这种方式执行底部的其余代码,除非我做错了什么。你真的能写下来吗?
-
如果
promises中的任何一个被拒绝,那么await将触发异常并且您的调度将不会被执行。 api调用失败时promise不会被拒绝吗?
标签: javascript asynchronous vue.js promise async-await