Разница между субъектом (являющимся частным случаем наблюдаемой) и наблюдаемой - PullRequest
1 голос
/ 02 марта 2020

Согласно документам по теме , это особый случай Observable , который позволяет всем наблюдателям использовать общий путь выполнения. Пример показывает, что каждый наблюдатель получает одинаковые испускаемые значения после подписки на источник.

Я не совсем понимаю, чем он отличается от случая, когда план Наблюдаемый испускает значения. Каждый из нескольких подписчиков получит каждое значение next 'ed. Значения, которые были отправлены до соответствующей подписки, не доставляются (если только у нас не было pipe 'в некоторых shareReply ' этих явных).

Что фактическая разница составляет Субъект особый случай Наблюдаемый ? Я упускаю очевидное, возможно.

Ответы [ 3 ]

4 голосов
/ 02 марта 2020

Наблюдаемый, по определению, производитель данных.

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

Это подразумевает две вещи.

  1. На субъект можно подписаться к, как наблюдаемая.
  2. Субъект может подписаться на другие наблюдаемые.

При этом существует одно критическое различие между субъектом и наблюдаемой.

Все подписчики на тему имеют одинаковое исполнение темы. т.е. когда субъект производит данные, все его подписчики получат одинаковые данные. Это поведение отличается от наблюдаемых, где каждая подписка вызывает независимое выполнение наблюдаемой.

Пример:

  // 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 мы получаем выходные данные, которые отправляются после подписки.

1 голос
/ 02 марта 2020

"... позволяет всем наблюдателям использовать общий путь выполнения": отметьте this out .

Я понимаю разницу между наблюдаемым и субъектом в том, что вы можете .next() значений в тему, но вы не можете сделать это с Observable.

0 голосов
/ 02 марта 2020

Так мы используем Subject. Используя subject (.next), вы можете получить sh новое значение, как показано ниже:

  var source = new Subject();
    source.map(x => ...).filter(x => ...).subscribe(x => ...)
    source.next('newValue1')
    source.next('newValue2')

Для создания субъекта нам не нужен какой-либо наблюдатель.

Мы можем создать новую Наблюдаемую с помощью Наблюдателя, как показано ниже:

var observable = Observable.create(observer => { 
    observer.next('newValue1'); 
    observer.next('newValue2'); 
    ... 
});
observable.map(x => ...).filter(x => ...).subscribe(x => ...)

Для создания наблюдаемой вам нужен как минимум один наблюдатель, и он (Наблюдаемая) сообщает только наблюдателю. Здесь вы не можете pu sh new value, он будет читать только то, что ответ получит из источников.

Вывод: я имею в виду, что Observable похожа только на чтение значений, но тема похожа на чтение и запись значений.

...