RxJS:字符串数组的开关映射

RxJS:字符串数组的开关映射,rxjs,Rxjs,以下用例:用户可以加入0…*组。每个组都有一个ID,包含0…*个帖子 我订阅了一个Observable(获取他加入的用户的组),这将返回一个字符串数组(组ID) 如果我只有一个,我现在会使用switchMap,返回这个新的可观察对象,并订阅它,以从组中获取帖子 但我有一个数组,所以这不起作用。有没有人知道哪个RxJS运营商可以做到这一点,从而获得所有组的帖子 或者这种用例不存在操作符,我必须在subscribe单独执行吗?可能的解决方案: 如果您知道将所有源观测值都作为一个数组,则可以理想地使用

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

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

如果我只有一个,我现在会使用
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);
});