Sobes.tech
Middle

Koje operatore za rad sa tokovima poznajete?

sobes.tech АИ

Одговор од АИ

Operatori za rad sa tokovima podataka, posebno relevantni u kontekstu asinhronog programiranja i reaktivnih biblioteka (poput RxJS), mogu se podeliti u nekoliko kategorija.

Operatori za kreiranje (Creation Operators): Koriste se za kreiranje novog toka podataka.

  • of(): Kreira tok koji emituje fiksni skup vrednosti.
    // Iz RxJS
    import { of } from 'rxjs';
    
    const source = of(1, 2, 3); // Tok koji emituje 1, 2, 3
    
  • from(): Pretvara različite izvore podataka (Promise, Iterable, ArrayLike) u tok.
    // Iz RxJS
    import { from } from 'rxjs';
    
    const source = from([10, 20, 30]); // Tok iz niza
    
  • interval(): Kreira tok koji emituje sekvencijalne brojeve u datom vremenskom intervalu.
    // Iz RxJS
    import { interval } from 'rxjs';
    
    const source = interval(1000); // Tok koji emituje brojeve svake sekunde
    
  • timer(): Kreira tok koji emituje jednu vrednost nakon određenog vremena, sa mogućnošću emitovanja narednih vrednosti u intervalu.
  • fromEvent(): Kreira tok iz DOM događaja ili EventEmitter-a.

Transformacioni operatori (Transformation Operators): Mijenjaju vrednosti koje tok emituje.

  • map(): Pretvara svaku vrednost emitovanu iz toka primenom zadane funkcije.
    // Iz RxJS
    import { of } from 'rxjs';
    import { map } from 'rxjs/operators';
    
    const source = of(1, 2, 3);
    const result = source.pipe(map(x => x * 2)); // Tok sa vrednostima 2, 4, 6
    
  • pluck(): Izvlači svojstvo iz svakog objekta emitovanog iz toka.
  • scan(): Primjenjuje akumulatorsku funkciju na svaku vrednost i emituje međurezultate.
  • mergeMap() / flatMap(): Projektuje svaku vrednost originalnog toka u novi tok (Inner Observable) i spaja ih.
    // Iz 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'))); // Vrednosti '1a', '1b', '2a', '2b'
    
  • switchMap(): Slično mergeMap, ali pri emitovanju nove vrednosti iz glavnog toka, otkazuje rad prethodnog unutrašnjeg toka.
  • concatMap(): Slično mergeMap, ali garantuje da će unutrašnji tokovi biti izvršeni redom njihovog kreiranja.

Operatori filtracije (Filtering Operators): Izbiraju vrednosti koje će proći.

  • filter(): Propušta samo one vrednosti koje zadovoljavaju uslov.
    // Iz 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)); // Vrednosti 2, 4
    
  • take(): Propušta samo prvih N vrednosti.
  • takeUntil(): Propušta vrednosti dok drugi tok ne emituje vrednost.
  • skip(): Preskače prvih N vrednosti.
  • debounceTime(): Emituje vrednost tek nakon što je tok prestao emitovati vrednosti tokom zadatog vremena.
  • distinctUntilChanged(): Emituje vrednost samo ako se razlikuje od prethodne.

Kombinacioni operatori (Combination Operators): Spajaju više tokova u jedan.

  • combineLatest(): Spaja poslednje vrednosti iz više tokova i emituje ih pri svakoj promeni.
  • zip(): Paruje vrednosti iz više tokova po indeksu.
  • merge(): Spaja više tokova, emitujući vrednosti kako pristižu.
  • concat(): Sekvencijalno spaja tokove.

Operatori za rukovanje greškama (Error Handling Operators): Određuju ponašanje u slučaju grešaka.

  • catchError(): Hvata grešku i omogućava nastavak ili zamenu toka.
    // Iz RxJS
    import { throwError } from 'rxjs';
    import { catchError, of } from 'rxjs/operators';
    
    const source = throwError(() => new Error('Nešto je pošlo po zlu'));
    const result = source.pipe(catchError(err => of('Greška je uhvaćena'))); // Tok sa vrednošću 'Greška je uhvaćena'
    
  • retry(): Pokušava ponovo pretplatiti se na tok N puta u slučaju greške.

Operatori za završetak (Completion Operators): Određuju ponašanje pri završetku toka.

  • finalize(): Izvršava zadatu radnju pri završetku (uspešnom ili sa greškom) ili otkazivanju pretplate.
  • tap(): Omogućava izvršavanje sporednih efekata (npr. logovanje) bez promene vrednosti.

Ovo je samo kratak, ali važan spisak operatora sa kojima se često radi u frontend razvoju, posebno pri korišćenju reaktivnog pristupa.