typescript - RXJS Subject - stoppa fel från att spridas


När flera observatörer prenumererar på ett RXJS Subject, är det möjligt att stoppa ett fel från en observatör från att spridas och förhindra att de andra observatörerna (registrerade senare) ser händelsen

Stackblitz Exempel: 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');

Här ser den tredje observatören inte händelsen när den andra kastar ett undantag, och test2-värdet ses inte av något eftersom det första felet effektivt stänger ner subjektet

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

Utan att uppenbart omsluta varje subscribe-block i en try catch, finns det ett bättre RXJS-sätt att se till att den tredje observatören fortfarande ser värdet och att det andra anropet till sub.next() också observeras?

Uppdatering (enligt cartants svar):

Detta hanteras bättre i rxjs6 - se uppdaterad Stackblitz med samma kod, men utan bieffekterna: https://stackblitz.com/edit/rxjs6-subject-err

Svar #1

Detta är ett känt problem med RxJS v5 och det är något som har åtgärdats i v6 - där den synkrona felhanteringen har ändrats.

I v6 kommer det du ser inte längre att hända. Istället kommer fel som kastas från inom 'listeners' att kastas om asynkront och kommer att ses av applikationen som ohanterade fel.

För mer information, se denna video.

Relaterade artiklar