【问题标题】:Is this the right way to filter a BehaviorSubject<object[]> with a another BehaviorSubject?这是用另一个 BehaviorSubject 过滤 BehaviorSubject<object[]> 的正确方法吗?
【发布时间】:2021-07-20 10:51:16
【问题描述】:

我已经在网上想了好几个小时关于如何用另一个 BehaviorSubject 过滤一个 BehaviorSubject 并听说过 switchMap,所以我实现了它。它有效,但我想知道是否有更合适的方法。 TIA。

// results$:arrayOfObject and activeEntityFilter$:number are both BehaviorSubjects
results$ = this.flowService.searchAppResult$;

filteredResult$ = this.activeEntityFilter$.pipe(
  switchMap((activeEntityFilter) =>
    this.results$.pipe(
      map((flows) => {
        return flows.filter((flow: any) => {
          return activeEntityFilter
            ? flow.initiator_id == activeEntityFilter
            : true;
        });
      })
    )
  )
);

【问题讨论】:

  • 这取决于你希望filteredResult$ observable 被触发的方式。使用switchMap 的解决方案仅在将新值推送到activeEntityFilter$ observable 时才会触发。在@NikhilWalvekar 使用combineLatest 的解决方案中,filteredResult$ 将在任一源接收到新值时触发。

标签: angular filter rxjs observable subject


【解决方案1】:

您可以使用combineLatest

当其中一个可观察对象发出新值时,将触发流程。

results$ = this.flowService.searchAppResult$;

filteredResult$ = combineLatest(this.activeEntityFilter$, results$).pipe(
                        map(([activeEntityFilter, results]) => {
                            return results.filter((result: any) => {
                                return activeEntityFilter
                                    ? result.initiator_id == activeEntityFilter
                                    : true;
                            });
                        })
                    );

【讨论】:

  • 顺便说一句,有没有办法拥有两个以上的 observables?对于两个以上的 observables 的 combineLatest() 的替代方法?
  • 刚刚发现 combineLatest 可以接受两个以上的输入。
猜你喜欢
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 2020-09-27
  • 1970-01-01
  • 2017-10-31
相关资源
最近更新 更多