typescript - RXJS Subject - stoppe feil fra å spre seg


Når flere observatører abonnerer på et RXJS Subject, er det mulig å forhindre at en feil fra en observatør sprer seg og stopper de andre observatørene (registrert senere) fra å se hendelsen

Stackblitz-eksempel: https://stackblitz.com/edit/rxjs-cy7swm

const sub = new Subject<string>();

sub.asObservable().subscribe((val) => {
  console.log('1st sees: ' + val);
});

sub.asObservable().subscribe((val) => {
  console.log('2nd sees: ' + val);
  throw new Error('2nd throws error');
});

sub.asObservable().subscribe((val) => {
  console.log('3rd sees: ' + val);
});

sub.next('test');
sub.next('test2');

Her ser ikke den tredje observatøren hendelsen når den andre kaster en unntak, og test2-verdien blir ikke sett av noe som helst ettersom den første feilen effektivt stopper subjektet

1st sees: test
2nd sees: test
ERROR Error: 2nd throws error

Uten å åpenbart pakke inn hver subscribe-blokk i en try catch, finnes det en bedre RXJS-rammeverksmåte å sørge for at den tredje observatøren fortsatt ser verdien og at det andre kallet til sub.next() også observeres?

Oppdatering (i henhold til cartants svar):

Dette håndteres bedre i rxjs6 - se oppdatert Stackblitz med den samme koden, men uten bivirkningene: https://stackblitz.com/edit/rxjs6-subject-err

Svar #1

Dette er et kjent problem med RxJS v5, og det er noe som har blitt tatt opp i v6 - der den synkrone feilhåndteringen har blitt endret.

I v6 vil det du ser ikke lenger skje. I stedet vil feil som kastes fra innenfor 'lyttefunksjoner' kastes på nytt asynkront og vil bli sett av applikasjonen som ubehandlede feil.

For mer informasjon, se denne videoen.

Relaterte artikler