Sobes.tech
Middle

Jakie operatory do pracy z przepływami znasz?

sobes.tech AI

Odpowiedź od AI

Operatory do pracy z strumieniami danych, szczególnie istotne w kontekście programowania asynchronicznego i bibliotek reaktywnych (np. RxJS), można podzielić na kilka kategorii.

Operatory tworzenia (Creation Operators): Służą do tworzenia nowego strumienia danych.

  • of(): Tworzy strumień emitujący ustalony zestaw wartości.
    // Z RxJS
    import { of } from 'rxjs';
    
    const source = of(1, 2, 3); // Strumień emitujący 1, 2, 3
    
  • from(): Zamienia różne źródła danych (Promise, Iterable, ArrayLike) na strumień.
    // Z RxJS
    import { from } from 'rxjs';
    
    const source = from([10, 20, 30]); // Strumień z tablicy
    
  • interval(): Tworzy strumień emitujący kolejne liczby co określony czas.
    // Z RxJS
    import { interval } from 'rxjs';
    
    const source = interval(1000); // Strumień emitujący liczby co sekundę
    
  • timer(): Tworzy strumień emitujący jedno wartość po określonym czasie, opcjonalnie z kolejnymi wartościami co interwał.
  • fromEvent(): Tworzy strumień z wydarzeń DOM lub EventEmitter.

Operatory transformacji (Transformation Operators): Modyfikują wartości emitowane przez strumień.

  • map(): Przekształca każdą wartość emitowaną przez strumień, stosując do niej funkcję.
    // Z RxJS
    import { of } from 'rxjs';
    import { map } from 'rxjs/operators';
    
    const source = of(1, 2, 3);
    const result = source.pipe(map(x => x * 2)); // Strumień z wartościami 2, 4, 6
    
  • pluck(): Wydobywa właściwość z każdego obiektu emitowanego przez strumień.
  • scan(): Akumuluje wartości, emitując pośrednie wyniki.
  • mergeMap() / flatMap(): Projekcja każdego elementu na nowy strumień i łączenie ich w jeden. Pozwala na asynchroniczne operacje.
    // Z RxJS
    import { of } from 'rxjs';
    import { mergeMap } from 'rxjs/operators';
    
    const source = of(1, 2);
    const result = source.pipe(mergeMap(val => of(val + 'a', val + 'b'))); // Strumień z wartościami '1a', '1b', '2a', '2b'
    
  • switchMap(): Podobny do mergeMap, ale anulowuje poprzedni wewnętrzny strumień przy emisji nowej wartości.
  • concatMap(): Zapewnia, że wewnętrzne strumienie będą wykonywane kolejno.

Operatory filtrowania (Filtering Operators): Przepuszczają wybrane wartości.

  • filter(): Przepuszcza wartości spełniające warunek.
    // Z RxJS
    import { of } from 'rxjs';
    import { filter } from 'rxjs/operators';
    
    const source = of(1, 2, 3, 4);
    const result = source.pipe(filter(x => x % 2 === 0)); // Strumień z wartościami 2, 4
    
  • take(): Przepuszcza pierwsze N wartości.
  • takeUntil(): Przepuszcza wartości do momentu emisji z innego strumienia.
  • skip(): Pomija pierwsze N wartości.
  • debounceTime(): Emituje wartość po określonym czasie od ostatniej emisji.
  • distinctUntilChanged(): Emituje wartość tylko jeśli różni się od poprzedniej.

Operatory łączenia (Combination Operators): Łączą kilka strumieni.

  • combineLatest(): Emisja ostatnich wartości z każdego strumienia przy zmianie któregokolwiek.
  • zip(): Paruje wartości z różnych strumieni.
  • merge(): Łączy strumienie, emitując wartości w kolejności pojawiania się.
  • concat(): Łączy strumienie kolejno.

Operatory obsługi błędów (Error Handling Operators): Zarządzają błędami.

  • catchError(): Przechwytuje błąd i pozwala kontynuować lub zamienić strumień.
    // Z RxJS
    import { throwError } from 'rxjs';
    import { catchError, of } from 'rxjs/operators';
    
    const source = throwError(() => new Error('Coś poszło nie tak'));
    const result = source.pipe(catchError(err => of('Błąd przechwycony'))); // Strumień z wartością 'Błąd przechwycony'
    
  • retry(): Powtarza subskrypcję N razy w przypadku błędu.

Operatory kończenia (Completion Operators): Określają zachowanie po zakończeniu.

  • finalize(): Wykonuje akcję po zakończeniu lub anulowaniu.
  • tap(): Pozwala na efekt uboczny bez zmiany wartości.

To nie jest pełna lista, ale ważne operatory, z którymi często pracuje się w frontendzie, szczególnie w podejściu reaktywnym.