consdata.com
Blog techniczny Blog biznesowy Dział HR
EN
rxjs

Czy wiesz, jak obsługiwać błędy w rxjs?

author Piotr Tatarski
26 lipca 2024

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żej
    map((num) => {
      if (num === 4) {
        throw new Error('test');
      }
      return num;
    }),
    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.
of(1, 2, 3, 4, 5)
  .pipe(
    map((num) => {
      if (num === 4) {
        throw new Error('testowy error');
      }
      return num;
    }),
    retry({
      count: 3,
      delay: (error, retryCount) => {
        console.log(`delay ${1000 * retryCount}`);
        return timer(1000 * retryCount);
      },
    })
  )
  .subscribe({ error: (err) => console.log('error', err.message) });
    
// delay 1000
// delay 2000
// delay 3000
// error testowy error

W powyższym przykładzie nastąpiła trzykrotna próba ponowienia operacji, ale z każdą kolejną próbą odstęp między nimi jest zwiększany o sekundę.

Przydatne linki

  • Dokumentacja operatora retry: https://rxjs.dev/api/index/function/retry
  • Dokumentacja operatora catchError: https://rxjs.dev/api/index/function/catchError
  • Wykonywalne kody z przykładów: https://stackblitz.com/edit/rxjs-vmvukg?devtoolsheight=60&file=index.ts, https://stackblitz.com/edit/rxjs-mgmtg5?devtoolsheight=60&file=index.ts
Najnowsze wpisy

  • Czy wiesz, że w Angularze istnieje sygnałowa alternatywa @ViewChild?
  • Czy wiesz, jak wykonać profilowanie aplikacji za pomocą JDK Flight Recorder?
  • Czy wiesz, jak analizować i optymalizować zależności w bundle?
Dołącz do nas

  • SENIOR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 14 900 - 20 590 PLN brutto
    B2B 19 680 - 27 220 PLN netto
  • REGULAR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 11 300 - 15 900 PLN brutto
    B2B 14 950 - 21 000 PLN netto
  • ZOBACZ WSZYSTKIE OGŁOSZENIA

Podobne wpisy

post-image
angular

Czy wiesz, że w Angularze istnieje sygnałowa alternatywa @ViewChild?

Pokażę sygnałową alternatywę dla @ViewChild w Angularze i jej zalety względem klasycznego podejścia z AfterViewInit.

author
Mariusz Bartosik 4 sie 2026
post-image
jdk-flight-recorder

Czy wiesz, jak wykonać profilowanie aplikacji za pomocą JDK Flight Recorder?

Podczas przeprowadzania testów wydajnościowych czasami napotykamy sytuację, w której ich wyniki nie są zadowalające. Pojawia się wtedy pytanie, jak sprawdzić, co dzieje się wewnątrz aplikacji i na co zużywa ona...

author
Jakub Wilczewski 24 lip 2026
post-image
CommonJS

Czy wiesz, jak analizować i optymalizować zależności w bundle?

Pokażę, jak analizować plik stats.json i skutecznie zmniejszać rozmiar bundle'a w Angularze poprzez optymalizację importów CommonJS oraz wykorzystanie ESM (lodash-es).

author
Aleksander Burzec 16 cze 2026
Dołącz do nas

  • SENIOR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 14 900 - 20 590 PLN brutto
    B2B 19 680 - 27 220 PLN netto
  • REGULAR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 11 300 - 15 900 PLN brutto
    B2B 14 950 - 21 000 PLN netto
  • ZOBACZ WSZYSTKIE OGŁOSZENIA
consdata.com
  • Kontakt

    • sales@consdata.com
    • +48 61 41 51 000

  • Biuro

    • K9Office
      Krysiewicza 9/14
      61-825 Poznań
      Polska

  • Rozwiązania

    • Eximee
    • Kouncil
  • Blog Dołącz do nas
Copyright © 2024 Consdata. All rights reserved. Privacy Policy & Cookies
Chcemy używać plików cookie oraz skryptów podmiotów trzecich do polepszania funkcjonowania tej strony Zgadzam się