Кои оператори за работа с потоци знаете?
sobes.tech AI
Отговор от AI
Оператори за работа с потоци от данни, особено актуални в контекста на асинхронното програмиране и реактивните библиотеки (като RxJS), могат да бъдат разделени на няколко категории.
Оператори за създаване (Creation Operators): Използват се за създаване на нов поток от данни.
of(): Създава поток, който излъчва фиксиран набор от стойности.// От RxJS import { of } from 'rxjs'; const source = of(1, 2, 3); // Поток, който излъчва 1, 2, 3from(): Преобразува различни източници на данни (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, 6pluck(): Извлича свойство от всеки обект, излъчван от потока.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, 4take(): Преминава само първите 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(): Позволява изпълнение на странични ефекти (например логване) без да променя стойностите.
Това е само кратък, но важен списък с оператори, с които често се работи във фронтенд разработката, особено при използване на реактивен подход.