如何基于从另一个可观察对象返回的键中的键创建可观察/ http请求的数组

时间:2018-10-31 20:30:35

标签: angular rxjs

因此,我试图围绕Observables进行研究,并且在大多数情况下它们是有意义的-但所有文档均假定您实际上正在使用数据流-并且Angular使每个http调用默认为可观察到的,即使这些不是流,而是隔离返回的值,这给我造成了一些困惑。

因此,我正在进行http调用,该调用返回一个对象数组。然后,我需要映射该数组,并基于每个对象内的键产生一个新的http调用。然后,我需要收集这些调用的所有响应,并映射到初始数组以基于第二个调用数组的响应设置属性。

请输入Sudo代码

this._http.get<>(url).subscribe(value => myData = value);

返回一个类似的数组

[
{ clientId: 1, ..additional properties},
{ clientId: 2, ..additional properties},
]

然后我需要对此进行映射并像这样产生新的http调用

response.map(item => {
 this._http.get(`someurl/${item.clientId})
}

然后我需要将所有这些调用合并到一个数据块中,以便我可以执行类似的操作

myData.map(item => {
item.fullClient = ArrayOfClientReturns.find(client => client.id === item.clientId);
}

我的问题是我完全理解如何用诺言做到这一点,但是对于可观察到的东西,我真的不确定。我了解如何使用pipe(map())合并可观察对象,但我不了解如何基于初始可观察对象的响应在一组数据上映射并生成可观察对象的集合,然后等待它们全部解决,然后像这样重新映射初始数据集。

我确定我只是在rxjs文档中缺少正确的方法,但是每个示例都显示了在尝试合并可观察对象之前将其合并的情况。

如果有人可以指出正确的方向,我会很感激。

1 个答案:

答案 0 :(得分:3)

您绝对走在正确的道路上,应该可以使用forkJoin之类的东西,它将加入Observables的数组

 this._http.get<any[]>(url).pipe(
        mergeMap(arr => forkJoin(arr.map((item) => this._http.get(`someurl/${item.clientId}`).pipe(map((name) => {
           item.name = name;
           return item;
        })
 ))))

在这里,我们使用数组map将对象数组转换为Observable s数组。然后,我们使用forkJoin将可观察变量数组合并为一个,然后使用mergeMap将其连接到原始请求。

(请注意,这是使用带有pipe的新rxjs语法,但是也可以使用较旧的语法来完成此操作)