Te damos la bienvenida a nuestro sitio web, aquí encontrarás la solucíon a lo que estás buscando.
Solución:
hay una manera de manejar los errores con forkJoin
eso no le impide usar este operador. Él key es en realidad parte de la otra respuesta.
Sí, forkJoin
se completará con el primer error y no puedes saber de qué observable proviene, pero si manejas los errores dentro de los observables internos, puedes lograrlo fácilmente.
Considere esta parte (minificada) de su código, mixed con la respuesta de @Explosion Pills:
reqs: Observable[] = [];
if (shouldUpdatePhone)
reqs.push(
this.service.updatePhone(phone)
.pipe(
catchError((err) =>
// Handle specific error for this call
return of(undefined)),
)
);
if (shouldUpdateAddress)
reqs.push(
this.service.updateAddress(address)
.pipe(
catchError((err) =>
// Handle specific error for this call
return of(undefined)),
)
);
Y luego, por su forkJoin
:
forkJoin(reqs).subscribe(result => console.log(result));
Ahora considere que ambas llamadas API devuelven un objeto como, respectivamente, phone: string
y address: string
. Su result
estarán:
[phone: '123-456', address: 'Happy Street, 123']
Pero bueno, eso es básico. forkJoin
¿dónde está la parte de manejo de errores?
Considere que una de sus llamadas falló, el error devuelto contiene un código de estado y un mensaje y desea conocerlos.
Como ya he dicho, forkJoin
no se completará si maneja el error dentro del observable interno, es por eso que tenemos
.pipe(
catchError((err) =>
// Handle specific error for this call
return of(undefined)),
)
Si su primera llamada (updatePhone) falla, su resultado sería
[undefined, address: 'Happy Street, 123']
Porque no dejaste que el Observable muriera y, por error, devolviste un nuevo Observable con return of(undefined)
.
Esto le abre la posibilidad de manejar errores como este (dentro catchError
):
catchError((err) =>
if (err.status === 409)
// do something
return of(undefined)),
O así
...
catchError((err) =>
return of(error: err, isError: true)),
...
forkJoin(...).subscribe(result =>
result.forEach(r =>
if (r.isError)
// do something
);
);
Todas sus llamadas API se completarán y puede manejarlas sobre la marcha o esperar a que todas regresen y manejar solo las que devolvieron el error, con esto puede obtener cualquier información que su error podría proporcionarle y manejarlo específicamente .
no puedes desde forkJoin
arrojará un error en el primer error que encuentre de cualquiera de los observables. Si no hay algo en el error que se emite que le indique de dónde proviene, como verificar un código de error, tiene la opción de manejar el error al crear el observable a partir de la llamada de servicio.
reqs = [];
if (shouldUpdatePhone)
reqs.push(
this.customerService.updatePhone(phoneUpdateRequest).pipe(catchError(() =>
throw 'phoneUpdateError';
);
)
if (shouldUpdateAddress)
reqs.push(
this.customerService.updateAddress(phoneUpdateRequest).pipe(catchError(() =>
throw 'addressUpdateError';
);
)
Ahora puede comprobar qué error se ha producido. Sin embargo, no tiene que hacer esto con el manejo de errores; también puede asignar el error a una respuesta exitosa y manejar eso.
En última instancia, recomendaría combinar estas llamadas API.
valoraciones y reseñas
Si te ha sido de utilidad este post, te agradeceríamos que lo compartas con el resto juniors y nos ayudes a difundir esta información.