RxJS является ядром реактивного программирования в Angular, обеспечивая работу с асинхронными потоками данных через Observables. Операторы RxJS позволяют трансформировать, фильтровать, комбинировать и управлять потоками событий, создавая гибкие и масштабируемые архитектуры.
Создание потоков (Creation Operators)
of(...items) — создаёт Observable, испускающий заданные
значения по очереди.from(array | promise | iterable) — конвертирует массив,
промис или любой итерируемый объект в поток.interval(period) — создаёт поток чисел через заданный
интервал времени.Преобразование (Transformation Operators)
map(fn) — трансформирует каждый элемент потока.mapTo(value) — заменяет каждый элемент фиксированным
значением.scan(accumulator, seed) — аккумулирует значения,
аналогично reduce в массивах, но для потоков.Фильтрация (Filtering Operators)
filter(predicate) — пропускает только элементы,
удовлетворяющие условию.take(count) — ограничивает поток первым
count элементами.first() / last() — берёт первый или
последний элемент потока.Комбинирование (Combination Operators)
merge(...observables) — объединяет несколько потоков,
испуская значения по мере их появления.concat(...observables) — объединяет потоки
последовательно, один за другим.combineLatest(...observables) — испускает массив
последних значений всех потоков при любом обновлении.Управление временем (Time-based Operators)
debounceTime(ms) — игнорирует значения, поступающие
чаще указанного интервала.throttleTime(ms) — пропускает первые значение и
блокирует последующие на период ms.delay(ms) — задержка перед выдачей значения.Фильтрация и трансформация потока кликов:
import { fromEvent } from 'rxjs';
import { map, filter, throttleTime } from 'rxjs/operators';
const button = document.querySelector('button');
fromEvent(button, 'click').pipe(
throttleTime(500),
map(event => event.clientX),
filter(x => x > 100)
).subscribe(x => console.log(`Клик с координатой X > 100: ${x}`));
Комбинирование нескольких потоков:
import { combineLatest, of, interval } from 'rxjs';
import { map } from 'rxjs/operators';
const streamA = interval(1000);
const streamB = of('A', 'B', 'C');
combineLatest([streamA, streamB]).pipe(
map(([num, char]) => `${char}${num}`)
).subscribe(console.log);
Hot потоки
начинают испускать значения независимо от подписки, Cold —
только при наличии подписчиков.unsubscribe или takeUntil предотвращает утечки
памяти при работе с долгоживущими потоками.pipe
позволяют создавать цепочки операторов, обеспечивая чистый и читаемый
код.Применение RxJS в Angular тесно связано с формами, HTTP-запросами и маршрутизацией. Операторы позволяют строить реактивные интерфейсы, обрабатывать сложные сценарии асинхронного взаимодействия и уменьшать количество явных состояний в приложении.