【问题标题】:Where to put ShareReplay(1) pipe在哪里放置 ShareReplay(1) 管道
【发布时间】:2021-06-13 05:31:46
【问题描述】:

我对 Firebase 数据库进行了以下调用。如果我想分享 observable 的结果,我应该把分享放在哪里(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 之前,因此它应该是这里的最后一个。我的假设正确吗?谢谢。

【问题讨论】:

    标签: google-cloud-firestore rxjs observable angularfire rxjs-pipeable-operators


    【解决方案1】:

    是的,你的假设是正确的。

    shareReplay(1) 基本上缓存了最后发出的值。如果将其放在管道的开头,则将为每个订阅者的每个发出的值执行以下所有运算符。放在最后会缓存处理后的结果,不管有多少订阅者,之前所有的操作符每个值只会执行一次。

    【讨论】:

      猜你喜欢
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 2011-06-29
      • 2018-03-27
      相关资源
      最近更新 更多