Quiero suscribirme a dos métodos observables, pero uno puede recibir un error y el segundo puede tener éxito. Pero cuando trato de hacerlo, solo obtengo un evento de error si uno de ellos devuelve el éxito
cuando estoy usando combineLatest solo obtengo un error incluso si el primero es exitoso
combineLatest( this.createTable1(), this.createTable2() ).pipe(untilDestroyed(this)) .subscribe(() => { alert('suceess'); }, (error) => { alert('error'); });cuando me gusta lo siguiente, solo funciona si falla el segundo, si falla el primero, no recibí una alerta de éxito:
this.createTable1().pipe(untilDestroyed(this)).subscribe( () => { alert('1suceess'); this.createTable2().pipe(untilDestroyed(this)).subscribe( () => { alert('2suceess'); }, () => { alert('error'); }); }, () => { alert('error'); });¿Cómo puedo arreglarlo?
Creo que su problema es que RxJS completa la transmisión una vez que se detecta un error antes de obtener el valor del otro, por lo que debe manejar los errores en cada transmisión y volver a convertirlos en observables.
combineLatest( this.createTable1().pipe(catchError(() => of('Errored'))), this.createTable2().pipe(catchError(() => of('Errored'))) ).pipe(untilDestroyed(this)) .subscribe(() => { alert('suceess'); }, (error) => { alert('error'); });Esto debería funcionar. Yo mismo no sabía esto, lo probé en este StackBlitz: https://stackblitz.com/edit/rxjs-xzdtpn?devtoolsheight=60&file=index.ts
Verá si comenta la línea 9, nunca llegaremos a conocer el observable posterior.
EDITAR: estoy agregando una versión diferente en caso de que no le importe saber si uno de los observables falló:
merge( this.createTable1().pipe(catchError(() => EMPTY)), this.createTable2().pipe(catchError(() => EMPTY)) ).pipe(untilDestroyed(this)) .subscribe(() => { alert('suceess'); }, (error) => { alert('error'); });