RxJS:字符串数组的SwitchMap

时间:2018-11-13 15:51:55

标签: rxjs

以下用例:用户可以加入0 ... *组。每个群组都有一个ID,并包含0 ... *个帖子。

我订阅了一个Observable(以获取他加入的用户组),这将返回一个字符串数组(组ID)。

const groupIds$ = of(['a', 'b', 'c']);

如果我只有一个,我现在将使用switchMap并返回此新的Observable并订阅以获取该群组的帖子。

但是我有一个数组,所以这不起作用。有谁知道哪个RxJS运算符可以实现这一点,以获取所有组的帖子?

还是不存在这种用例的运算符,我必须在订阅时单独进行操作?

3 个答案:

答案 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(...);