Наблюдаемый, по определению, производитель данных.
С другой стороны, субъект может выступать в роли и производителя данных, и потребителя данных.
Это подразумевает две вещи.
- На субъект можно подписаться к, как наблюдаемая.
- Субъект может подписаться на другие наблюдаемые.
При этом существует одно критическое различие между субъектом и наблюдаемой.
Все подписчики на тему имеют одинаковое исполнение темы. т.е. когда субъект производит данные, все его подписчики получат одинаковые данные. Это поведение отличается от наблюдаемых, где каждая подписка вызывает независимое выполнение наблюдаемой.
Пример:
// Here a subject is acting like a data producer
const subject = new Subject();
const subjObserv = subject.asObservable();
subjObserv.subscribe((data: number) => console.log("subect A " + data));
for (let i = 1; i <= 5; i++) subject.next(i);
subjObserv.subscribe((data: number) => console.log("subect B " + data));
subject.next(6);
// simple observer
const plainObs = Observable.of([1, 2, 3, 4, 5]);
plainObs.subscribe(data => console.log("plain onservable A " + data));
plainObs.subscribe(data => console.log("plain onservable B " + data));
Вывод:
subect A 1
subect A 2
subect A 3
subect A 4
subect A 5
subect A 6
subect B 6
plain onservable A 1,2,3,4,5
plain onservable B 1,2,3,4,5
As вы можете заметить, что мы получаем выходные данные столько раз, сколько мы подписываемся plainObs
, но для subjObserv
мы получаем выходные данные, которые отправляются после подписки.