Angular Observable излучает столько событий, сколько у меня подписчиков - PullRequest
2 голосов
/ 06 марта 2019

Проблемы с пониманием наблюдаемой угловой.Я создаю наблюдаемую, которая испускает случайное число один раз.У меня 2 подписчика, я получаю два разных номера.Если у меня 3 подписчика, я получу 3 разных номера.Я знаю, с observable мы получаем только 1 номер.

const observable = Rx.Observable.create((observer) => {
  observer.next(Math.random());
});
  
// subscription 1
observable.subscribe((data) => {
  console.log('Observer Subscriber A:', data); 
});
  
// subscription 2
observable.subscribe((data) => {
 console.log('Observer Subscriber B:', data); 
});

// subscription 3
observable.subscribe((data) => {
  console.log('Observer Subscriber C:', data); 
 });
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.4.0/rxjs.umd.min.js"></script>

Как он излучает столько событий, сколько у меня подписчиков?

Ответы [ 2 ]

3 голосов
/ 06 марта 2019

Вы можете использовать оператор share() для многоадресной передачи значений.

https://www.learnrxjs.io/operators/multicasting/share.html

const observable = Observable.create((observer) => {
  observer.next(Math.random());
}).pipe(share());

Функция наблюдателя выполняется каждый раз, когда подписчик присоединяется к наблюдаемому.Оператор share подписывается и создает новую наблюдаемую величину, которая выдаст последнее значение.

0 голосов
/ 06 марта 2019

Вместо этого используйте BehaviorSubject.

const { BehaviorSubject } = rxjs;

const observable$ = new BehaviorSubject(Math.random());

observable$.subscribe((data) => {
  console.log('Observer Subscriber A:', data); 
});

// subscription 2
observable$.subscribe((data) => {
 console.log('Observer Subscriber B:', data); 
});

// subscription 3
observable$.subscribe((data) => {
  console.log('Observer Subscriber C:', data); 
});

observable$.next(Math.random());
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.4.0/rxjs.umd.min.js"></script>

BehaviorSubjects - лучший друг активных разработчиков.

...