Sobes.tech
Middle

Кои оператори за работа с потоци знаете?

sobes.tech AI

Отговор от AI

Оператори за работа с потоци от данни, особено актуални в контекста на асинхронното програмиране и реактивните библиотеки (като RxJS), могат да бъдат разделени на няколко категории.

Оператори за създаване (Creation Operators): Използват се за създаване на нов поток от данни.

  • of(): Създава поток, който излъчва фиксиран набор от стойности.
    // От RxJS
    import { of } from 'rxjs';
    
    const source = of(1, 2, 3); // Поток, който излъчва 1, 2, 3
    
  • from(): Преобразува различни източници на данни (Promise, Iterable, ArrayLike) в поток.
    // От RxJS
    import { from } from 'rxjs';
    
    const source = from([10, 20, 30]); // Поток от масив
    
  • interval(): Създава поток, който излъчва последователни числа през зададен интервал от време.
    // От RxJS
    import { interval } from 'rxjs';
    
    const source = interval(1000); // Поток, който излъчва числа всяка секунда
    
  • timer(): Създава поток, който излъчва едно стойност след зададено време, с възможност за последващи стойности през интервал.
  • fromEvent(): Създава поток от DOM събития или EventEmitter.

Трансформационни оператори (Transformation Operators): Променят стойностите, излъчвани от потока.

  • map(): Преобразува всяка стойност, излъчвана от потока, като прилага дадена функция.
    // От RxJS
    import { of } from 'rxjs';
    import { map } from 'rxjs/operators';
    
    const source = of(1, 2, 3);
    const result = source.pipe(map(x => x * 2)); // Поток със стойности 2, 4, 6
    
  • pluck(): Извлича свойство от всеки обект, излъчван от потока.
  • scan(): Прилага акумулаторна функция към всяка стойност и излъчва междинни резултати.
  • mergeMap() / flatMap(): Проектира всяка стойност на оригиналния поток към нов поток (Inner Observable) и ги обединява.
    // От 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'))); // Стойности '1a', '1b', '2a', '2b'
    
  • switchMap(): Подобно на mergeMap, но при излъчване на нова стойност от основния поток отменя работата на предишния вътрешен поток.
  • concatMap(): Подобно на mergeMap, но гарантира, че вътрешните потоци ще се изпълняват последователно по реда на създаването им.

Филтриращи оператори (Filtering Operators): Избират стойности, които да преминат.

  • filter(): Пропуска само стойности, които отговарят на условие.
    // От 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)); // Стойности 2, 4
    
  • take(): Преминава само първите N стойности.
  • takeUntil(): Преминава стойности, докато друг поток не излъчи стойност.
  • skip(): Пропуска първите N стойности.
  • debounceTime(): Излъчва стойност само след като потокът е спрял да излъчва за зададено време.
  • distinctUntilChanged(): Излъчва стойност само ако е различна от предишната.

Комбиниращи оператори (Combination Operators): Обединяват няколко потока в един.

  • combineLatest(): Обединява последните стойности от няколко потока и ги излъчва при всяка промяна.
  • zip(): Обединява стойностите от няколко потока по индекс.
  • merge(): Обединява няколко потока, излъчвайки стойностите им както пристигат.
  • concat(): Свързва потоците последователно.

Обработващи грешки оператори (Error Handling Operators): Определят поведение при грешки.

  • catchError(): Хваща грешка и позволява да се продължи или да се замени потокът.
    // От RxJS
    import { throwError } from 'rxjs';
    import { catchError, of } from 'rxjs/operators';
    
    const source = throwError(() => new Error('Нещо се обърка'));
    const result = source.pipe(catchError(err => of('Грешката е хваната'))); // Поток с стойност 'Грешката е хваната'
    
  • retry(): Опитва се да се абонира отново към потока N пъти при грешка.

Оператори за завършване (Completion Operators): Определят поведението при завършване на потока.

  • finalize(): Изпълнява зададено действие при завършване (успешно или с грешка) или анулиране на абонамента.
  • tap(): Позволява изпълнение на странични ефекти (например логване) без да променя стойностите.

Това е само кратък, но важен списък с оператори, с които често се работи във фронтенд разработката, особено при използване на реактивен подход.