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