ShareReplay(1) 管道放在哪里
Where to put ShareReplay(1) pipe
我对 Firebase 数据库进行了以下调用。如果我想分享 observable 的结果,我应该把分享放在哪里 really(1) ?
get userStacks(): Observable<StackModel[]> {
return this.auth.authState
.pipe(
shareReplay(1), ===>>> HERE ?
switchMap(user => {
if (user) {
return this.db
.collection<StackModel>('stacks', ref =>
ref.where('perm.readers', 'array-contains', user.uid),
)
.valueChanges()
.pipe(shareReplay(1), ===>>> HERE ?
stackList =>
combineLatest([
stackList,
this.dataService.currentNormalOrReverse,
this.idsFilter$,
]).pipe(
shareReplay(1), ===>>> HERE ?
map(([stacks, normalOrReverse]) => [
...StacksService.sortAlphabetical(stacks, normalOrReverse),
]),
),
);
}
return [];
}),
)
.pipe(shareReplay(1)), ===>>> HERE?
}
我想它应该是链中的最后一个操作,就在我订阅 observable 之前,因此它应该是这里的最后一个。我的假设正确吗?谢谢。
是的,你的假设是正确的。
shareReplay(1)
基本上缓存最后发出的值。如果将它放在管道的开头,将为每个订阅者的每个发射值执行以下所有运算符。将其放在最后会缓存处理后的结果,并且无论有多少订阅者,之前的所有运算符都只会为每个值执行一次。
我对 Firebase 数据库进行了以下调用。如果我想分享 observable 的结果,我应该把分享放在哪里 really(1) ?
get userStacks(): Observable<StackModel[]> {
return this.auth.authState
.pipe(
shareReplay(1), ===>>> HERE ?
switchMap(user => {
if (user) {
return this.db
.collection<StackModel>('stacks', ref =>
ref.where('perm.readers', 'array-contains', user.uid),
)
.valueChanges()
.pipe(shareReplay(1), ===>>> HERE ?
stackList =>
combineLatest([
stackList,
this.dataService.currentNormalOrReverse,
this.idsFilter$,
]).pipe(
shareReplay(1), ===>>> HERE ?
map(([stacks, normalOrReverse]) => [
...StacksService.sortAlphabetical(stacks, normalOrReverse),
]),
),
);
}
return [];
}),
)
.pipe(shareReplay(1)), ===>>> HERE?
}
我想它应该是链中的最后一个操作,就在我订阅 observable 之前,因此它应该是这里的最后一个。我的假设正确吗?谢谢。
是的,你的假设是正确的。
shareReplay(1)
基本上缓存最后发出的值。如果将它放在管道的开头,将为每个订阅者的每个发射值执行以下所有运算符。将其放在最后会缓存处理后的结果,并且无论有多少订阅者,之前的所有运算符都只会为每个值执行一次。