异步功能未捕获(承诺)未定义错误

时间:2019-05-02 15:04:01

标签: javascript vue.js

我正尝试在创建/更新条目之前进行一些验证,如下所示:

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()函数也可以使用。如何处理这种承诺错误情况?

2 个答案:

答案 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.
}