在 BehaviorSubject 管道中使用 shareReplay(1) 的任何理由?

Dre*_*nai 1 rxjs

我正在使用一个库,它使用一种非常常见的BehaviorSubject模式从服务类中公开数据。与实现和我自己看到/使用的唯一显着区别是添加了一个pipewithshareReplay(1)运算符。我不确定是否shareReplay需要。如果有的话,shareReplay在这种情况下有什么影响?

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

注意:我已经阅读了许多关于 shareReplay 的文章,并且我看到了有关 shareReplay 和 Subject 的不同组合的问题,但不是这个特定的

Adr*_*and 6

不是在您的示例中,但想象一下,如果映射函数中有一些复杂的逻辑来转换数据,那么共享重放将保存为每个订阅运行的复杂逻辑。

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); });
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.1/rxjs.umd.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

比较没有共享,地图发生了两次。

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); });
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.1/rxjs.umd.min.js"></script>
Run Code Online (Sandbox Code Playgroud)