RxJS:字符串数组的开关映射
以下用例:用户可以加入0…*组。每个组都有一个ID,包含0…*个帖子 我订阅了一个Observable(获取他加入的用户的组),这将返回一个字符串数组(组ID) 如果我只有一个,我现在会使用RxJS:字符串数组的开关映射,rxjs,Rxjs,以下用例:用户可以加入0…*组。每个组都有一个ID,包含0…*个帖子 我订阅了一个Observable(获取他加入的用户的组),这将返回一个字符串数组(组ID) 如果我只有一个,我现在会使用switchMap,返回这个新的可观察对象,并订阅它,以从组中获取帖子 但我有一个数组,所以这不起作用。有没有人知道哪个RxJS运营商可以做到这一点,从而获得所有组的帖子 或者这种用例不存在操作符,我必须在subscribe单独执行吗?可能的解决方案: 如果您知道将所有源观测值都作为一个数组,则可以理想地使用
switchMap
,返回这个新的可观察对象,并订阅它,以从组中获取帖子
但我有一个数组,所以这不起作用。有没有人知道哪个RxJS运营商可以做到这一点,从而获得所有组的帖子
或者这种用例不存在操作符,我必须在subscribe单独执行吗?可能的解决方案:
如果您知道将所有源观测值都作为一个数组,则可以理想地使用
forkJoin
:
groupIds$.pipe(
concatMap(groups => {
const observables = groups.map(id => ...);
return forkJoin(...observables);
})
).subscribe(...);
forkJoin
将以与groupIds$
中相同的顺序发出一个包含所有结果的数组
最终,如果您不关心顺序,只想并行获得所有结果,您可以使用
merge
而不是forkJoin
(我指的是直接从rxjs
导入的名为merge
的“可观察的创建方法”。而不是'rxjs/operators'
中的merge
操作符).每个回答这个问题的人,下面是“字符串数组的开关映射”(感谢martin)的答案。您只需使用“rxjs”中的“merge”(而不是运算符!)。在switchMap内部返回合并,您就完成了:
groupIds$.pipe(
switchMap(groups => {
const observables = groups.map(id => {
// your function that returns the observable
return something.getObservable(id);
});
return merge(...observables);
})
).subscribe(data => {
console.log('DATA', data);
});
我不知道你想做什么。您想为
groupIds$
中的每个项目创建一个可观察的并订阅所有项目吗?或者您只想订阅第一个发出的项目?第一个:我想为groupIds$中的每个项目创建一个可观察项目,然后订阅所有项目。正如我所说的,如果我只有一个,我会使用switchMap并订阅新的可观察对象,但是对于一个字符串数组,这是不可能的,因为mergeMap(id=>{…})
中的“id”仍然是一个数组,只有在我有最终值时才会工作,但我的可观察对象是一个不完整的流,但是我已经找到了一个解决方案->forkJoin不起作用,因为它只有在可观察对象完成时才发出。我的观察不完整,因为如果团队中有新的帖子到达,它将被释放。但是合并似乎起作用了:)谢谢!我使用switchMap;,而不是concatMap;)
groupIds$.pipe(
concatMap(groups => {
const observables = groups.map(id => ...);
return forkJoin(...observables);
})
).subscribe(...);
groupIds$.pipe(
switchMap(groups => {
const observables = groups.map(id => {
// your function that returns the observable
return something.getObservable(id);
});
return merge(...observables);
})
).subscribe(data => {
console.log('DATA', data);
});