我正尝试在创建/更新条目之前进行一些验证,如下所示:
async save(){
return new Promise((resolve, reject)=>{
if(!this.isCampaignValid){
this.handleError()
reject()
}
else{
this.$store
.dispatch('updateCampaign')
.then((res)=>{
resolve()
this.showNotification(res.message, 'success')
})
.catch(error=>{
this.showNotification(error.message, 'error')
reject()
})
}
})
},
isCampaignValid
是计算有效性的计算值。
如果广告系列无效,那么我在控制台中收到如下错误:
未定义(承诺)未定义
this.handleError()
函数也可以使用。如何处理这种承诺错误情况?
答案 0 :(得分:1)
以防万一handleError()抛出异常,请尝试:
if (!this.isCampaignValid) {
try {
this.handleError()
} catch (e) {
console.error(e);
}
reject()
}
答案 1 :(得分:0)
首先,您不需要在async
函数中返回诺言。它隐式返回一个,用函数返回的值解析,或者如果函数抛出,则用错误对象拒绝。尽管您可以返回一个承诺,然后JS为您解压缩了它,但这是不需要的代码。
也就是说,因为async
返回了一个承诺,所以您也必须抓住。由于您的第一个条件块只会引发错误但无法捕获,因此save
返回的承诺将被拒绝。您需要处理该拒绝。
这是代码的简化版本,以查看发生的地方。
async save(){
if(!this.isCampaignValid){
this.handleError()
// Throwing an error in an async function is equivalent to a reject.
throw new Error('Campaign is not valid') // Here
}
else{
try {
const res = await this.$store.dispatch('updateCampaign')
this.showNotification(res.message, 'success')
} catch (e) {
this.showNotification(error.message, 'error')
}
}
},
// When you call save, catch the error
yourObject.save()
.then(() => {...})
.catch(() => {...})
// If your call is in an async function, you can try-catch as well
try {
await yourObject.save()
} catch(e) {
// It failed.
}