Biblioteka rxjs dostarcza kilka mechanizmów, które ułatwiają reagowanie na nieprzewidziane sytuacje występujące podczas procesowania strumienia danych w aplikacji.
Operator catchError
Jednym z najpopularniejszych jest operator catchError. Operator ten pozwala nam zareagować na sytuację, kiedy w strumieniu z jakiegoś powodu nagle wystąpi błąd. Zamiast brzydkiego błędu w konsoli możemy w catchError dostarczyć Observable, który będzie przetwarzany dalej w strumieniu.
Ważne, aby catchError znajdował się po operacji, w której wystąpi błąd. Inaczej nie nie zostanie przechwycony.
Przykładowy kod:
of(1,2,3,4,5).pipe(catchError(()=>of(99)),// Ten catchError nie obsłuży błędu występującego niżejmap((num)=>{if(num===4){thrownewError('test');}returnnum;}),catchError((error)=>of(`Złapano błąd ${error}`))).subscribe({next:console.log,error:(err)=>console.log('error',err.message),complete:()=>console.log('completed'),});// 1// 2// 3// Złapano błąd Error: test// completed
Jak widać, błąd został złapany i nigdy nie wpadł w obsługę error observera.
Operator retry
Kolejnym operatorem pozwalającym na obsługę błędów jest operator retry. Jak sama nazwa wskazuje, operator ten pozwala na ponowienie operacji. Jest to przydatne, jeżeli zakładamy, że operacja w strumieniu może się zakończyć niepowodzeniem z przyczyn niezależnych od użytkownika, np. niedostępności usługi. retry ponowi wtedy obsługę, zaczynając od początku strumienia.
Retry nie tylko pozwala nam zdefiniować liczbę (count) ponownych wywołań, lecz także odstęp między nimi (delay). Parametr delay może przyjmować wartość w milisekundach między wywołaniami lub funkcję zwracającą strumień.
Jeżeli strumień w delay wyemituje wartość lub zakończy się bez emitowania wartości - retry ponowi operacje.
Jeżeli strumień w delay zakończy się błędem - retry przerwie ponawianie operacji.