¿Cómo cancelar la unsubscribe cuando recibí un error en la canalización?
Me suscribo a la tubería subjectPipe fuera de la función doWork .
Dentro de la función doWork arrojo un error (puede ser como parte de mi flujo lógico).
Todo funciona como se esperaba, pero subjectPipe es log: "in subject error" y debido a que usé take(1) pensé que debería cancelar la suscripción, pero no sucede porque no se invoca la función completa.
¿Cómo cancelar la unsubscribe cuando ocurre un error?
Lo único que se me ocurre es crear la variable error$ y usar takeUntil y luego la función de error para invocar error$ . pero no quiero hacerlo porque es una variable adicional y el código será complicado si lo hago para cada caso que tengo.
import { Subject, throwError } from 'rxjs'; import { map, switchMap, take, tap } from 'rxjs/operators'; console.clear(); const doWork = () => { const subject = new Subject(); const work = () => { throw new Error('bla'); }; const subjectPipe = subject.pipe( tap(() => { console.log('in subject pipeline'); }), switchMap(() => work()) ); subjectPipe.subscribe({ next: () => console.log('in subjectPipe next'), error: () => console.log('in subjectPipe error'), complete: () => console.log('in subjectPipe complete'), }); return { subject, subjectPipe }; }; const { subject, subjectPipe } = doWork(); subjectPipe .pipe( take(1), tap(() => console.log('continue the pipe...')) ) .subscribe({ next: () => console.log('in subject next'), error: () => console.log('in subject error'), complete: () => console.log('in subject complete'), }); subject.next(null);El error significa finalización (sin embargo, la devolución de llamada asociada con complete nunca se llama). Por lo tanto, no es necesario darse de unsubscribe de la transmisión manualmente aquí.
En su caso, si necesita llamar a alguna lógica tanto en finalización como en error, puede usar el operador de finalización RxJS, que se llamará en ambos casos.
subjectPipe .pipe( take(1), tap(() => console.log('continue the pipe...')), finalize(() => console.log( 'You can do the final stuff here, instead of `complete` callback' ) ) ) .subscribe({ next: () => console.log('in subject next'), error: () => console.log('in subject error'), complete: () => console.log('in subject complete'), });