如何基于从另一个 observable 返回的数组中的键创建一组 observable/http 请求

tra*_*les 3 rxjs angular

所以我试图围绕 Observables 进行思考,并且在大多数情况下它们是有道理的 - 但所有的文档都假设你实际上是在处理数据流 - 并且 Angular 使每个 http 调用默认为一个 observable,即使这些不是流,而是隔离返回的值,这让我有些困惑。

所以,我正在进行一个 http 调用,它返回一个对象数组。然后我需要映射该数组,并根据每个对象中的键生成一个新的 http 调用。然后我需要收集来自这些调用的所有响应,并映射初始数组以根据来自第二个调用数组的响应设置一个属性。

原谅 Sudo 代码

this._http.get<>(url).subscribe(value => myData = value);
Run Code Online (Sandbox Code Playgroud)

它返回一个数组,如

[
{ clientId: 1, ..additional properties},
{ clientId: 2, ..additional properties},
]
Run Code Online (Sandbox Code Playgroud)

然后我需要映射这个并像这样产生新的 http 调用

response.map(item => {
 this._http.get(`someurl/${item.clientId})
}
Run Code Online (Sandbox Code Playgroud)

然后我需要将所有这些调用组合成一个数据块,这样我就可以做类似的事情

myData.map(item => {
item.fullClient = ArrayOfClientReturns.find(client => client.id === item.clientId);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我完全理解如何用 Promise 做到这一点,但是对于 observables,我真的不确定。我了解如何使用 pipe(map()) 来组合 observables,但我不明白如何映射数据数组并根据初始 observable 的响应生成一组 observables,然后等待它们全部完成解析,然后像这样重新映射初始数据集。

我确定我只是在 rxjs 文档中遗漏了正确的方法,但是每个示例都显示了在尝试组合它们之前组合已经存在的 observables。

如果有人能指出我正确的方向,我将不胜感激。

use*_*994 7

你绝对走在正确的道路上,你应该能够使用类似的东西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;
        })
 ))))
Run Code Online (Sandbox Code Playgroud)

在这里,我们使用数组map函数将对象数组转换为Observables数组。然后我们使用forkJoin将 observables 数组合并为一个,并使用mergeMap将其加入到原始请求中。

(请注意,这是使用新的 rxjs 语法 with pipe,但也可以使用旧语法完成)

  • 这正是我所需要的。非常感谢。我想我现在对 observable 的理解要好得多。 (2认同)