Subject в RxJS: краткое введение

Subject (далее здесь будет для лучшего понимания называться сабж) — это одновременно зритель и зрелище (о зрелищах — здесь). Иначе говоря, сабж имеет методы как зрелища, так и зрителя.

Мы можем генерировать события в сабже, используя .next(), успешно завершать сабж с помощью .complete() и завершать сабж ошибкой посредством .error() .

Виды сабжа:

  • Subject (обыкновенный сабж):
const subject = new Subject();
subject.subscribe(x => console.log(x));
subject.next(1);    // в консоли: 1
subject.next(2); // в консоли: 2
subject.complete();

В обыкновенном сабже зритель реагирует на каждое событие и выводит в консоль информацию, передаваемую в событии.

  • AsyncSubject (асинхронный сабж)
const subject = new AsyncSubject();
subject.subscribe(x => console.log(x));
subject.next(1);
subject.next(2);
subject.complete(); // в консоли: 2

Асинхронный сабж уведомляет своих зрителей только о последнем произошедшем событии и только когда сабж успешно завершается. Если асинхронный сабж завершится ошибкой, его зрители будут уведомлены только об ошибке.

  • BehaviorSubject (поведенческий сабж)
const subject = new BehaviorSubject(0);
subject.subscribe(x => console.log(x)); // в консоли: 0
subject.next(1); // в консоли: 1
subject.next(2); // в консоли: 2
console.log(subject.getValue()) // в консоли: 2
subject.subscribe(x => console.log(x)); // в консоли: 2
subject.complete();

При подписке поведенческий сабж уведомляет своего зрителя о последнем произошедшем в нём событии или, если в сабже ещё не происходило событий, создаёт для зрителя событие с изначальной информацией. Изначальная информация передаётся при создании поведенческого сабжа, в примере выше мы передаём 0 .

Важно! Поведенческий сабж имеет полезный метод .getValue() , который возвращает информацию, содержавшеюся в последнем произошедшем в сабже событии.

  • ReplaySubject (повторяющий сабж)
const subject = new ReplaySubject();
subject.subscribe(x => console.log(x));
subject.next(1); // в консоли: 1
subject.next(2); // в консоли: 2
subject.subscribe(x => console.log(x));
// в консоли:
// 1
// 2
subject.complete();

При подписке повторяющий сабж уведомляет своего зрителя о всех произошедшем в нём событиях с момента создания. Для увеличения производительности, мы можем ограничить количество событий, повторяющихся для каждого нового зрителя:

const subject = new ReplaySubject(2); // будут повторяться только 2 последних события
subject.subscribe(x => console.log(x));
subject.next(1); // в консоли: 1
subject.next(2); // в консоли: 2
subject.next(2); // в консоли: 3
subject.subscribe(x => console.log(x));
// в консоли:
// 2
// 3
subject.complete();

Любой вид сабжа может быть преобразован в зрелище с помощью метода .asObservable() .