以下用例:用户可以加入0 ... *组。每个群组都有一个ID,并包含0 ... *个帖子。
我订阅了一个Observable(以获取他加入的用户组),这将返回一个字符串数组(组ID)。
const groupIds$ = of(['a', 'b', 'c']);
如果我只有一个,我现在将使用switchMap
并返回此新的Observable并订阅以获取该群组的帖子。
但是我有一个数组,所以这不起作用。有谁知道哪个RxJS运算符可以实现这一点,以获取所有组的帖子?
还是不存在这种用例的运算符,我必须在订阅时单独进行操作?
答案 0 :(得分:2)
如果您知道将所有源可观测对象都作为数组,则可以理想地使用forkJoin
:
groupIds$.pipe(
concatMap(groups => {
const observables = groups.map(id => ...);
return forkJoin(...observables);
})
).subscribe(...);
forkJoin
将发出一个数组,所有结果的顺序与groupIds$
中的顺序相同。
最终,如果您不关心顺序,而只是想并行获取所有结果,则可以使用merge
而不是forkJoin
(我的意思是称为“ {{ 1}}是直接从merge
导入的,而不是rxjs
是从merge
导入的。)
答案 1 :(得分:1)
所有遇到此问题的人,这里都是“字符串数组的switchMap”的答案(感谢马丁)。您只需要使用来自“ rxjs”的“合并”(而不是运算符!)。在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);
});
答案 2 :(得分:0)
可能的解决方案:https://www.learnrxjs.io/operators/transformation/mergemap.html。
const groupIds$ = of(['a', 'b', 'c']);
const myPromise = id =>
new Promise(resolve => resolve(something.getPostsByGroupId(id)));
const posts$ = groupIds$.pipe(
mergeMap(
id => myPromise(id),
(valueFromSource, valueFromPromise) => {
return valueFromPromise;
}));
posts$.subscribe(...);