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) 基本上缓存最后发出的值。如果将它放在管道的开头,将为每个订阅者的每个发射值执行以下所有运算符。将其放在最后会缓存处理后的结果,并且无论有多少订阅者,之前的所有运算符都只会为每个值执行一次。