Какие виды Subject существуют в RxJS?
Signals и RxJS
Subject — это одновременно Observable и Observer: на него можно подписаться и в него можно отправлять значения через next(). Он рассылает каждое значение всем текущим подписчикам (multicast).
Виды
- `Subject` — базовый. Подписчик получает только значения, пришедшие после подписки.
- `BehaviorSubject` — хранит текущее значение и сразу отдаёт его новому подписчику. Требует начальное значение.
- `ReplaySubject` — запоминает последние N значений (и, при желании, окно по времени) и воспроизводит их новым подписчикам.
- `AsyncSubject` — отдаёт подписчикам только последнее значение и только после
complete().
const state$ = new BehaviorSubject<number>(0);
state$.subscribe((v) => console.log('A', v)); // A 0
state$.next(1); // A 1
state$.subscribe((v) => console.log('B', v)); // B 1
const log$ = new ReplaySubject<string>(2);
log$.next('a'); log$.next('b'); log$.next('c');
log$.subscribe(console.log); // b, cКогда что брать
Subject— события, у которых не должно быть «истории»: клики, уведомления.BehaviorSubject— состояние, у которого всегда есть текущее значение (текущий пользователь, фильтры); значение доступно и синхронно черезgetValue().ReplaySubject— когда поздний подписчик должен «догнать» недавние события.AsyncSubject— результат, важный только по завершении.
Нюансы
- Наружу отдают
subject.asObservable(), чтобы потребители не могли вызватьnext(). - После
error()илиcomplete()Subject больше не принимает значения. - Подписки на Subject нужно закрывать (
takeUntilDestroyed,asyncpipe), иначе будут утечки.
Коротко для собеседования
Subject — multicast без истории, BehaviorSubject — с текущим значением, ReplaySubject — с буфером последних значений, AsyncSubject — только финальное значение при завершении. Наружу выставляют asObservable().