es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Operador zip de RxJs, ¿qué uno arroja un error y continuar según la condición?

Tengo 2 llamadas de servicio API que combino en un observable:

const firstAPIrequest = this.firstApi.getData();
const secondAPIrequest = this.secondApi.getData();

const combined = zip(firstAPIrequest, secondAPIrequest);

Actualmente los mapeo para devolver un array:

combined.pipe(
     map((res) => {
        return [res[0], res[1]) //sólo un ejemplo
     }
);

Luego lo uso como una suscripción en un componente distinto

combined.subscribe(
   (res) => this.handleData(res),
   (err) => {
      console.debug('Fetch failed', err);
   }
)

En este caso, si una de las llamadas a API falla, mostrará un error, pero me gustaría comprobar cuál ha fallado entre ellas. Por ejemplo, si la request1 devuelve datos y la request2 falla, aún quiero devolver los datos de request1.

He intentado catchError pero no creo que pueda obtener los datos en esta función:

combined.pipe(
   catchError((err) => ...), // Cómo obtengo los datos antes de lanzar un error?
   map((res) => {
      return [res[0], res[1]) //sólo un ejemplo
   }
);
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para comprobar qué llamada a la API ha fallado, se puede utilizar catchError y devolver un observable con el mensaje de error y la petición que falló. Aquí tienes un ejemplo:

    import { zip, throwError } from 'rxjs';
    import { catchError } from 'rxjs/operators';
    
    const primeraPeticionAPI = this.firstApi.getData();
    const segundaPeticionAPI = this.secondApi.getData();
    
    const combinado = zip(primeraPeticionAPI, segundaPeticionAPI).pipe(
      catchError((error) => {
        // Comprobar qué petición ha fallado
        if (error[0]) {
          return throwError({ message: 'Falló la primera petición', error: error[0] });
        }
        return throwError({ message: 'Falló la segunda petición', error: error[1] });
      })
    );
    
    combinado.subscribe(
      (res) => this.handleData(res),
      (err) => {
        console.debug('Falló la solicitud', err);
        // Registrar qué petición ha fallado y el mensaje de error
        console.debug(err.message, err.error);
      }
    );
    

    En este ejemplo, si la primera llamada a la API falla, devolverá un observable con el mensaje de error “Falló la primera petición” y el objeto de error. Si la segunda llamada falla, devolverá un observable con el mensaje de error “Falló la segunda petición” y el objeto de error. A continuación, se puede registrar qué petición ha fallado y el mensaje de error en el controlador de errores de la suscripción.

Comments are closed.