Quiero ejecutar algunas solicitudes en paralelo usando forkJoin y combinar sus resultados como se muestra a continuación. Sin embargo, cuando una de las solicitudes falla, el navegador cancela automáticamente el resto de las suscripciones. ¿Cuál es una alternativa simple a forkJoin que me permite ejecutar solicitudes en paralelo y si una suscripción falla, el resto puede completarse?
const posts = this.http.get("https://myApi.com/posts?userId=1"); const albums = this.http.get("https://myApi.com/albums?userId=1"); forkJoin([posts, albums]).subscribe((result) => { this.print(result[0], result[1]); }); print(res1, res2) { const message = res1.text + res2.text; console.log(message); }Puede lograrlo usando forkJoin , sin embargo, debe manejar los errores para cada sub Observable por separado usando catchError para evitar cancelar la transmisión si ocurre algún error.
Puedes intentar algo como lo siguiente:
// import { catchError } from 'rxjs/operators'; // import { forkJoin, of } from 'rxjs'; const posts = this.http .get('https://myApi.com/posts?userId=1') .pipe(catchError((err) => of(err))); const albums = this.http .get('https://myApi.com/albums?userId=1') .pipe(catchError((err) => of(err))); forkJoin([posts, albums]).subscribe((result) => { this.print(result[0], result[1]); });Yo haría una función como
forkJoinReplaceErrors<T,R>( observables: Observable<T>[], ifError: ObservableInput<R> ) { return forkJoin( observables.pipe( catchError(() => ifError) ) ); } y luego use eso en lugar de forkJoin . Entonces es más reutilizable y se puede probar la unidad.