BACK
Уроки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, у которых эта проблема решена.

Что нужно сделать

  1. Создайте Subject: const subject = new Subject();
  2. Под первой подпиской вызовите subject.next(1).
  3. Под второй подпиской вызовите subject.next(2).
  4. Ожидаемый вывод: 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 // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...