Según los datos de entrada, quiero decidir si son datos válidos o no y enviar el observable hasta el final.
He intentado crear un subscribe.next() observable y secuencial que funciona correctamente, pero aparece cualquier error y luego no funciona ninguna declaración.
const observable = new Observable((subscriber) => { subscriber.next(1); subscriber.next(2); subscriber.error('failed this after second'); subscriber.next(3); subscriber.next(4); subscriber.complete(); }); observable.subscribe({ next(x) { console.log('got value ' + x); }, error(err) { console.error('something wrong occurred: ' + err); }, complete() { console.log('done'); }, });Salida de corriente:
Rendimiento esperado
Aquí está el enlace de stackblitz https://stackblitz.com/edit/zlksm5?devtoolsheight=50&file=index.ts
Énfasis mío.
Si quieres algo que siga funcionando después de que se complete, no quieres un observable.
Simplemente emita su error como un valor. Podría (por ejemplo) envolver sus emisiones en objetos de notificación RxJS para que pueda materialize o dematerialize observables y mantener una API de emisiones consistente.
Por ejemplo:
const observable = new Observable(subscriber => { subscriber.next({ kind: "N", value: 1 }); subscriber.next({ kind: "N", value: 2 }); subscriber.next({ kind: "E", error: new Error("failed this after second") }); subscriber.next({ kind: "N", value: 3 }); subscriber.next({ kind: "N", value: 4 }); subscriber.next({ kind: "C" }); subscriber.complete(); }); /**** Alternative written more succinctly ****/ const observable = of( { kind: "N", value: 1 }, { kind: "N", value: 2 }, { kind: "E", error: new Error("failed this after second") }, { kind: "N", value: 3 }, { kind: "N", value: 4 }, { kind: "C" } ); observable.subscribe((notification) => { switch (notification.kind) { case "N": console.log("got value ", notification.value); break; case "E": console.error("something wrong occurred: ", notification.error.message); break; case "C": console.log("done"); } });No creo que sea posible con un Observable, porque el observable se cerrará si ocurriera algún error.
Lo he intentado de dos maneras, poniéndolo como referencia.
//interval(1000) observable //.pipe(switchMap(() => observable)) .pipe( catchError((d) => { observable.subscribe((nd) => { console.log('--again--', nd); }); return of(d); }) //retry(1) ) .subscribe({ next(x) { console.log('got value ' + x); }, error(err) { console.error('something wrong occurred: ' + err); }, complete() { console.log('done'); }, }); // interval(1000) // .pipe(switchMap(_ => observable)) // .pipe( // catchError((d) => {return of(d)}), // switchMap(_ => observable) // ) // .subscribe(d => { // console.log(d) // })Para su caso de uso, es mejor usar un tema de comportamiento en su lugar.