1. Debo obtener alguna información del servidor.
  2. Si la información no es válida, debo buscar información mediante otra consulta al servidor.
  3. Si la información no es válida nuevamente, debo devolver una promesa rechazada (error)
  4. Si la información era válida en 2 o 3 pasos, debería guardarla y devolver la promesa resuelta al código de llamada

Lo hice usando async / await. Pero no puedo entender cómo hacer esto usando entonces y atrapar bloques.

Mi código:

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 })
}

ACTUALIZACIÓN: Mi variante final es:

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]
      })
}
0
Alexander Lopatin 8 feb. 2020 a las 11:44

2 respuestas

La mejor respuesta

A expensas de pasar un resultado exitoso por un paso de la cadena de promesa, puede reemplazar la función async con algo como

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;
       });
};

La promesa devuelta cumple con el valor return something o se rechaza con un error.

1
traktor53 8 feb. 2020 a las 09:36

La regla general es cambiar todo

someVar = await somePromise;
// more lines

En

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

Estás tratando de hacer dos cosas separadas, parece que:

  • Recuperar los datos (reintentar una vez)

  • Haz algo con los datos

Para ser menos repetitivo, y para que jueguen bien con la sintaxis .then, póngalos en funciones separadas:

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
}

Y

this.loadSettingReport()
  .then(response => this.processSettingsReport(response))
  .catch((error) => {
    console.log("Promise worked with Error")
    console.log(error)
  })
2
CertainPerformance 8 feb. 2020 a las 11:05