2 Вопрос: Асинхронная функция Uncaught (в обещании) неопределенная ошибка

вопрос создан в Thu, May 2, 2019 12:00 AM

Я пытаюсь выполнить некоторые проверки перед созданием /обновлением записи, как показано ниже:

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 - это вычисленное значение, которое вычисляет действительность.

Если кампания недействительна, я получаю сообщение об ошибке в консоли, как показано ниже:

  

Uncaught (в обещании) undefined

Функция this.handleError() тоже работает. Как справиться с этой ошибкой обещания?

    
0
  1. Похоже, это в вашем isCampaignValid, нет?
    2019-05-02 15: 06: 13Z
2 ответа                              2                         

На всякий случай, если сработает handleError (), попробуйте:

if (!this.isCampaignValid) {
  try {
    this.handleError()
  } catch (e) {
    console.error(e);
  }
  reject()
}
    
1
2019-05-02 15: 13: 37Z

Прежде всего, вам не нужно возвращать обещание в функции 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.
}
    
0
2019-05-02 15: 17: 06Z
источник размещен Вот