我正在尝试将多个可观察对象合并为一个可观察对象,用于从服务器检索数据。
我最初的方法是:
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
接受了可选参数,则仅在它们具有值时才包括在内,否则就忽略它们。
答案 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$ } )