Sobes.tech
Middle

Kokius operatorius žinote dirbant su srautais?

sobes.tech AI

Atsakymas iš AI

Duomenų srautų valdymo operatoriai, ypač aktualūs asinchroninio programavimo ir reaktyvių bibliotekų (pvz., RxJS) kontekste, gali būti suskirstyti į kelias kategorijas:

Kūrimo operatoriai (Creation Operators): naudojami naujo srauto kūrimui:

  • of(): sukuria srautą, kuris išleidžia tam tikrą reikšmių rinkinį:
    // Iš RxJS
    import { of } from 'rxjs';
    
    const source = of(1, 2, 3); // Srautas, išleidžiantis 1, 2, 3
    
  • from(): paverčia įvairius šaltinius (Promise, Iterable, ArrayLike) į srautą:
    // Iš RxJS
    import { from } from 'rxjs';
    
    const source = from([10, 20, 30]); // Srautas iš masyvo
    
  • interval(): sukuria srautą, kuris išleidžia seką skaičių tam tikru laiko intervalu:
    // Iš RxJS
    import { interval } from 'rxjs';
    
    const source = interval(1000); // Srautas, išleidžiantis skaičius kas sekundę
    
  • timer(): sukuria srautą, kuris išleidžia vieną reikšmę po nustatyto laiko, taip pat gali išleisti seką reikšmių intervalais:
  • fromEvent(): sukuria srautą iš DOM įvykių arba EventEmitter:

Transformacijos operatoriai (Transformation Operators): keičia srauto išleidžiamas reikšmes:

  • map(): keičia kiekvieną reikšmę, taikydamas nurodytą funkciją:
    // Iš RxJS
    import { of } from 'rxjs';
    import { map } from 'rxjs/operators';
    
    const source = of(1, 2, 3);
    const result = source.pipe(map(x => x * 2)); // Srautas, išleidžiantis 2, 4, 6
    
  • pluck(): ištraukia savybę iš kiekvieno objekto sraute:
  • scan(): taiko akumuliacinę funkciją ir išleidžia tarpinį rezultatą:
  • mergeMap() / flatMap(): kiekvieną reikšmę paverčia nauju srautu ir sujungia juos:
    // Iš 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'))); // Srautas, išleidžiantis '1a', '1b', '2a', '2b'
    
  • switchMap(): keičiant reikšmę, nutraukia ankstesnį srautą:
  • concatMap(): vykdo srautus eilės tvarka:

Filtravimo operatoriai (Filtering Operators): atrenka reikšmes:

  • filter(): leidžia tik toms reikšmėms, kurios atitinka sąlygą:
    // Iš 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)); // Išleidžia 2, 4
    
  • take(): leidžia tik pirmus N reikšmių:
  • takeUntil(): leidžia reikšmes, kol kitas srautas išleidžia reikšmę:
  • skip(): praleidžia pirmas N reikšmių:
  • debounceTime(): išleidžia reikšmę tik po to, kai srautas nustoja keistis tam tikru laiku:
  • distinctUntilChanged(): išleidžia tik reikšmę, kuri skiriasi nuo ankstesnės:

Kombinavimo operatoriai (Combination Operators): sujungia kelis srautus:

  • combineLatest(): sujungia paskutines reikšmes iš visų srautų:
  • zip(): sujungia reikšmes pagal indeksą:
  • merge(): sujungia srautus, išleidžiant reikšmes jų atsiradimo tvarka:
  • concat(): vykdo srautus eilės tvarka:

Klaidų valdymo operatoriai (Error Handling Operators): tvarko klaidas:

  • catchError(): gaudo klaidą ir gali tęsti arba pakeisti srautą:
    // Iš RxJS
    import { throwError } from 'rxjs';
    import { catchError, of } from 'rxjs/operators';
    
    const source = throwError(() => new Error('Kažkas įvyko'));
    const result = source.pipe(catchError(err => of('Klaida pagauta'))); // Srautas, išleidžiantis 'Klaida pagauta'
    
  • retry(): pakartoja srautą N kartų klaidos atveju:

Užbaigimo operatoriai (Completion Operators): nustato, ką daryti, kai srautas baigiasi:

  • finalize(): atlieka veiksmą pabaigoje arba atšaukimo metu:
  • tap(): atlieka šalutinius efektus (pvz., logavimą):

Tai nėra pilnas, bet svarbus operatorių sąrašas, dažnai naudojamas frontend kūrime, ypač taikant reaktyvų požiūrį.