Уроки38. Subject: горячий multicast-поток
Уроки · 38
38. Subject: горячий multicast-поток
Subject — поток, в который можно «толкать»
До этого мы только подписывались на Observable. Но иногда нужно отправлять значения извне: события из компонента, экшены пользователя, EventEmitter. Для этого есть Subject.
Subject одновременно:
- Observable — на него можно подписаться.
- Observer — у него есть метод
.next(value), через который любой может «толкать» значения.
Multicast (один источник — много подписчиков)
В отличие от cold Observable, который запускает свою логику для каждого подписчика отдельно, Subject работает как «hub»: все подписчики получают одни и те же значения. Это и называют multicast.
Без памяти
Обычный Subject ничего не помнит. Новый подписчик слышит только то, что произойдёт после его подписки. Прошлые значения для него потеряны. Это важно — в следующих уроках мы изучим BehaviorSubject и ReplaySubject, у которых эта проблема решена.
Что нужно сделать
- Создайте Subject:
const subject = new Subject(); - Под первой подпиской вызовите
subject.next(1). - Под второй подпиской вызовите
subject.next(2). - Ожидаемый вывод:
Sub A: 1 → Sub A: 2 → Sub B: 2. Sub B не услышал1— подписался позже.
Решение spoiler · click to reveal
const { Subject } = Rx;
const subject = new Subject();
subject.subscribe(value => console.log('Sub A: ' + value));
subject.next(1);
subject.subscribe(value => console.log('Sub B: ' + value));
subject.next(2); script.ts
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...