RXJS合并x个可观察对象,其中n个为可选

时间:2019-12-20 10:11:36

标签: rxjs

我正在尝试将多个可观察对象合并为一个可观察对象,用于从服务器检索数据。

我最初的方法是:

filters$ = combineLatest([
   filter1$,
   filter2$,
   filter3$
])

这样,我可以使用一个可观察到的过滤器与服务器一起使用。

this.filters$.pipe(
   switchMap(filters => goToServer(filters))
)

但是,如果其中一个过滤器是可选的(取决于使用系统的用户类型),我该如何处理?如果filter3$仅对某些用户可用,则过滤器将永远不会发出那些无法访问它的过滤器。 (API处理得很好,但过滤器是可选的)

我可以使用startWith()

filters$ = combineLatest([
   filter1$,
   filter2$,
   filter3$.pipe(
      startWith(null)
   )
])

但是,这可能会给我多个可以访问filter3$的用户的网络请求,理想情况下,我希望避免这种情况。

有人知道这个问题的解决方案吗?一种非常棒的方法是,如果combineLatest接受了可选参数,则仅在它们具有值时才包括在内,否则就忽略它们。

2 个答案:

答案 0 :(得分:2)

定义可观察变量的数组,并有条件地推动第三个。

const toBeUsedFilters = [filter1$, filter2$];
if (isFilter3Available) toBeUsedFilters.push(filter3$);

filters$ = combineLatest(toBeUsedFilters);

答案 1 :(得分:0)

这可能是功能齐全且反应迅速的方法。 2filter $和3filter $都是可重用的

const 3filter$=filters$ = combineLatest([
   filter1$,
   filter2$,
   filter3$
]);

const 2filter$=filters$ = combineLatest([
   filter1$,
   filter2$,
]);

userInfo$.pipe(switchMap(userInfo => { userInfo.someRole ?3filter$  : 2filter$ } ) 
相关问题