PassFront
  1. PassFront
  2. База знаний
  3. Signals и RxJS

Какие виды 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, async pipe), иначе будут утечки.

Коротко для собеседования

Subject — multicast без истории, BehaviorSubject — с текущим значением, ReplaySubject — с буфером последних значений, AsyncSubject — только финальное значение при завершении. Наружу выставляют asObservable().

Другие вопросы раздела