RXJS组合x个观测值,其中n个是可选的

RXJS组合x个观测值,其中n个是可选的,rxjs,Rxjs,我正试图将多个可观测值组合成一个可观测值,用于从服务器检索数据 我最初的做法如下: filters$ = combineLatest([ filter1$, filter2$, filter3$ ]) 这样,我就可以有一个可观察到的过滤器进入服务器 this.filters$.pipe( switchMap(filters => goToServer(filters)) ) 但是,如果根据使用系统的用户类型,其中一个过滤器可以是可选的,我该如何处理这个问题。如果

我正试图将多个可观测值组合成一个可观测值,用于从服务器检索数据

我最初的做法如下:

filters$ = combineLatest([
   filter1$,
   filter2$,
   filter3$
])
这样,我就可以有一个可观察到的过滤器进入服务器

this.filters$.pipe(
   switchMap(filters => goToServer(filters))
)
但是,如果根据使用系统的用户类型,其中一个过滤器可以是可选的,我该如何处理这个问题。如果
filter3$
仅对某些用户可用,则过滤器将永远不会发出那些无权访问它的用户。(API处理此罚款时,过滤器是可选的)

我可以使用
startWith()

但是,这可能会给有权访问
filter3$
的用户提供多个网络请求,这在理想情况下是我希望避免的


有人知道这个问题的优雅解决方案吗?如果
combineLatest
接受了可选参数,那么一个非常好的方法就是只包含它们有值的参数,如果没有,则忽略它们。

定义可观察的数组并有条件地推送第三个

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

filters$ = combineLatest(toBeUsedFilters);

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

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

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

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

将数组设置为不同的
combinelateest
不是更好吗?也许可以代替
filter3$.pipe
类似于:
userBasedCondition()?filter3$:of(null)
?这可能是一个解决方案,但不是一个非常被动的解决方案。当两个不同的用户使用同一台机器一个接一个地登录时(我承认edge案例),它必须是一个rxjs链,才能正确更改。类似于
filter3Corrected$=userInfo$.pipe(switchMap(userInfo=>{userInfo.someRole?filter3$:of(null)})
的东西可能会起作用。虽然我认为它不是很优雅:),但我认为这很好。在某些情况下,需要做出决定,我想,你如何隐藏事实只是一种偏好这可能是一个比简单地将过滤器标记为可选的更明确的解决方案,因为您将对何时设置过滤器和何时不设置过滤器有明确的解释。然而,我很好奇是否有一个可选的解决方案是可行的:)
const 3filter$=filters$ = combineLatest([
   filter1$,
   filter2$,
   filter3$
]);

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

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