我正在使用一个库,它使用一种非常常见的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 的不同组合的问题,但不是这个特定的
不是在您的示例中,但想象一下,如果映射函数中有一些复杂的逻辑来转换数据,那么共享重放将保存为每个订阅运行的复杂逻辑。
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)
| 归档时间: |
|
| 查看次数: |
921 次 |
| 最近记录: |