Есть ли причина использовать shareReplay (1) в канале BehaviorSubject? - PullRequest
0 голосов
/ 30 апреля 2019

Я использую библиотеку, которая предоставляет данные из класса обслуживания, используя довольно распространенный шаблон BehaviorSubject. Единственное заметное отличие от реализации и того, что я видел / использовал сам, - это добавление pipe с оператором shareReplay(1). Я не уверен, требуется ли shareReplay. Какой эффект, если он есть, имеет shareReplay в этом случае?

// "rxjs": "^6.3.0"
this.data = new BehaviorSubject({});
this.data$ = this.data.asObservable().pipe(
   shareReplay(1) 
)

Примечание: я прочитал несколько статей о shareReplay, и я видел вопросы о различных комбинациях shareReplay и Subject, но не об этой конкретной

1 Ответ

2 голосов
/ 30 апреля 2019

Не в вашем примере, но представьте, что если в функции карты, которая преобразовывала данные, была какая-то сложная логика, то при совместном воспроизведении эта сложная логика сохранялась бы для каждой подписки.

const { BehaviorSubject } = rxjs;
const { map, shareReplay } = rxjs.operators;

const bs$ = new BehaviorSubject('initial value');

const obs$ = bs$.pipe(
  map(val => {
    console.log('mapping');
    return 'mapped value';
  }),
  shareReplay()
);

obs$.subscribe(val => { console.log(val); });

obs$.subscribe(val => { console.log(val); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.1/rxjs.umd.min.js"></script>

Сравнение без доли, карта происходит дважды.

const { BehaviorSubject } = rxjs;
const { map } = rxjs.operators;

const bs$ = new BehaviorSubject('initial value');

const obs$ = bs$.pipe(
  map(val => {
    console.log('mapping');
    return 'mapped value';
  })
);

obs$.subscribe(val => { console.log(val); });

obs$.subscribe(val => { console.log(val); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.1/rxjs.umd.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...