Как сделать эту цепочку обещаний без async / await, используя затем catch - PullRequest
0 голосов
/ 08 февраля 2020
  1. Я должен получить с сервера некоторую информацию.
  2. Если информация неверна, я должен получить информацию, используя другой запрос к серверу.
  3. Если информация не верна снова в силе, я должен вернуть отклоненное обещание (ошибка)
  4. Если информация действительна на 2 или 3 шагах, я должен сохранить ее и вернуть решенное обещание с кодом вызова

Я сделал это с помощью async / await. Но я не могу понять, как это сделать, используя тогда и ловить блоки.

Мой код:

this.loadSettingReport()
  .then(() => {
    console.log("Success!")
  })
  .catch((error) => {
    console.log("Promise worked with Error")
    console.log(error)
  })

//...

async loadSettingReport() {
  console.log("SettingReport - Company")
  let response = await findAllSettingsReports(this.$axios, /*someParameters*/) //request via axios - return promise
  let data = response.data
  console.log(data)
  if(data.length === 0) {
    console.log("SettingReport - Common")
    response = await findAllSettingsReports(this.$axios, /*other someParameters*/) //request via axios  - return promise
    data = response.data
    if (data.length === 0) {
      console.log("SettingReport - NotFound")
      throw new Error("SettingReport - NotFound")
    }
  }
  //Do something...
},

//...

export const findAllSettingsReports = function($axios, params = {}){
  return $axios.get(url, isEmpty(params) ? {} : { params: params })
}

ОБНОВЛЕНИЕ: Мой последний вариант:

loadSettingReport() {
   return findAllSettingsReports(this.$axios, {variant: "ID", rows: true, search: "common:false,company.id:"+this.company.id + ",typeReport.id:" + this.typeReportId})
      .then(response => {
         if(response.data.length == 0) {
            return findAllSettingsReports(this.$axios, {variant: "ID",  rows: true, search: "common:true,typeReport.id:" + this.typeReportId})
         }
         return response
      })
      .then(response => {
         if(response.data.length == 0) {
            throw new Error("Настройка отчетов не найдена")
         }
         this.setting = response.data[0]
         return response.data[0]
      })
}

Ответы [ 2 ]

2 голосов
/ 08 февраля 2020

Общее правило состоит в том, чтобы изменить все

someVar = await somePromise;
// more lines

на

return somePromise.then((someVar) => {
  // more lines
});

Вы пытаетесь сделать две разные вещи, это выглядит так:

  • Извлечение данных (повторите попытку)

  • Сделайте что-нибудь с данными

Чтобы быть менее повторяющимися и иметь их Играйте хорошо с синтаксисом .then, поместите их в отдельные функции:

loadSettingReport(retries = 1) {
  return findAllSettingsReports(this.$axios, /*someParameters*/).then((response) => {
    if(response.data.length === 0) {
      if (retries === 0) {
        throw new Error("SettingReport - NotFound");
      }
      return this.loadSettingReport(retries - 1);
    }
    return response;
  });
},
processSettingsReport(response) {
  // do something
}

и

this.loadSettingReport()
  .then(response => this.processSettingsReport(response))
  .catch((error) => {
    console.log("Promise worked with Error")
    console.log(error)
  })
1 голос
/ 08 февраля 2020

За счет передачи успешного результата на шаг цепочки обещаний вы можете заменить функцию async на что-то вроде

const loadSettingReport = () => {
    return findAllSettingsReports(this.$axios( /*someParameters*/ ))
       .then (response => {
           if( response.data) {
              return response;
           }
           return findAllSettingsReports(this.$axios( /*other Parameters*/ ))
       })
       .then (response => {
           if( !response.data) {
               console.log("SettingReport - NotFound")
               throw new Error("SettingReport - NotFound")
           }

           // .... do something with response 

           return something;
       });
};

Возвращенное обещание выполняется со значением return something или отклонено с ошибкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...