所以我试图围绕 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。
如果有人能指出我正确的方向,我将不胜感激。
你绝对走在正确的道路上,你应该能够使用类似的东西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,但也可以使用旧语法完成)
| 归档时间: |
|
| 查看次数: |
1887 次 |
| 最近记录: |