- Тема : При подписке он всегда получает данные, которые отправляются после подписки, т.е. предыдущие отправленные значения не принимаются .
const mySubject = new Rx.Subject();
mySubject.next(1);
const subscription1 = mySubject.subscribe(x => {
console.log('From subscription 1:', x);
});
mySubject.next(2);
const subscription2 = mySubject.subscribe(x => {
console.log('From subscription 2:', x);
});
mySubject.next(3);
subscription1.unsubscribe();
mySubject.next(4);
В этом примере вот результат, который будет напечатан в консоли:
From subscription 1: 2
From subscription 1: 3
From subscription 2: 3
From subscription 2: 4
Обратите внимание, как в подписках, которые поступают с опозданием, не хватает некоторых данных, которые были помещены в тему.
- Субъекты воспроизведения : могут помочь, сохраняя буфер предыдущих значений, которые будут отправлены в новые подписки.
Вот пример использования субъектов воспроизведения, где buffer of 2 previous values
сохраняются и отправляются новые подписки:
const mySubject = new Rx.ReplaySubject(2);
mySubject.next(1);
mySubject.next(2);
mySubject.next(3);
mySubject.next(4);
mySubject.subscribe(x => {
console.log('From 1st sub:', x);
});
mySubject.next(5);
mySubject.subscribe(x => {
console.log('From 2nd sub:', x);
});
Вот что это дает нам на консоли:
From 1st sub: 3
From 1st sub: 4
From 1st sub: 5
From 2nd sub: 4
From 2nd sub: 5
- Субъекты поведения : аналогичны субъектам воспроизведения, но будут повторно выдавать только последнее переданное значение или значение по умолчанию, если ранее не выдавалось никакого значения:
const mySubject = new Rx.BehaviorSubject('Hey now!');
mySubject.subscribe(x => {
console.log('From 1st sub:', x);
});
mySubject.next(5);
mySubject.subscribe(x => {
console.log('From 2nd sub:', x);
});
И результат:
From 1st sub: Hey now!
From 1st sub: 5
From 2nd sub: 5
Ссылка: https://alligator.io/rxjs/subjects/