В RxJS Subject — это особый тип Observable, который позволяет multicast (многоадресная рассылка) значения многим подписчикам. Рассмотрим основные виды Subject и их особенности.
Базовый Subject — это "горячий" Observable, который:
const subject = new Subject<number>();
subject.subscribe(v => console.log(`Subscriber A: ${v}`));
subject.next(1); // Subscriber A: 1
subject.subscribe(v => console.log(`Subscriber B: ${v}`));
subject.next(2);
// Subscriber A: 2
// Subscriber B: 2
Когда использовать:
BehaviorSubject хранит текущее значение и отправляет его новым подписчикам:
const behaviorSubject = new BehaviorSubject<number>(0); // 0 - начальное значение
behaviorSubject.subscribe(v => console.log(`Subscriber A: ${v}`));
// Сразу получает текущее значение: Subscriber A: 0
behaviorSubject.next(1); // Subscriber A: 1
behaviorSubject.subscribe(v => console.log(`Subscriber B: ${v}`));
// Получает последнее значение: Subscriber B: 1
Особенности:
.value
)Когда использовать:
ReplaySubject может "воспроизводить" несколько предыдущих значений новым подписчикам:
const replaySubject = new ReplaySubject<number>(2); // хранит 2 последних значения
replaySubject.next(1);
replaySubject.next(2);
replaySubject.next(3);
replaySubject.subscribe(v => console.log(`Subscriber A: ${v}`));
// Получает 2 последних значения:
// Subscriber A: 2
// Subscriber A: 3
Можно также указать время "жизни" значений (в миллисекундах):
const replaySubject = new ReplaySubject<number>(100, 500);
// хранит 100 последних значений или те, что были отправлены за последние 500мс
Особенности:
Когда использовать:
Характеристика | Subject | BehaviorSubject | ReplaySubject |
---|---|---|---|
Начальное значение | Нет | Да | Нет |
Хранит текущее значение | Нет | Да | Да (настраиваемое количество) |
Новые подписчики получают | Ничего | Текущее значение | Последние N значений |
Использование | События | Состояние | История событий |