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

Angular 如何根据从另一个可观察对象返回的数组中的键创建一个可观察/http请求数组,angular,rxjs,Angular,Rxjs,因此,我试图将我的头脑集中在可观察的对象上,在大多数情况下,它们是有意义的——但所有文档都假设您实际上正在处理一个数据流——Angular使每个http调用都默认为一个可观察的对象,即使这些不是流,但会隔离返回的值,这对我造成了一些混乱 因此,我正在进行一个http调用,它返回一个对象数组。然后,我需要映射该数组,并基于每个对象中的一个键生成一个新的http调用。然后,我需要收集来自这些调用的所有响应,并映射到初始数组,以根据来自第二个调用数组的响应设置属性 请原谅Sudo密码 this._ht

因此,我试图将我的头脑集中在可观察的对象上,在大多数情况下,它们是有意义的——但所有文档都假设您实际上正在处理一个数据流——Angular使每个http调用都默认为一个可观察的对象,即使这些不是流,但会隔离返回的值,这对我造成了一些混乱

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

请原谅Sudo密码

this._http.get<>(url).subscribe(value => myData = value);
然后我需要映射到这一点,并生成新的http调用,就像这样

response.map(item => {
 this._http.get(`someurl/${item.clientId})
}
然后我需要将所有这些调用合并到一个数据块中,这样我就可以执行以下操作

myData.map(item => {
item.fullClient = ArrayOfClientReturns.find(client => client.id === item.clientId);
}
我的问题是,我完全理解如何通过承诺来实现这一点,但对于可观察性,我真的不确定。我知道如何使用管道(map())组合观测值,但我不知道如何映射一组数据,并根据初始观测值的响应生成一组观测值,然后等待它们全部解析,然后像这样重新映射初始数据集

我确信我只是缺少rxjs文档中的正确方法,但每个示例都显示了在尝试组合之前组合已经存在的观察值


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

你走的路绝对正确,你应该能够利用像
forkJoin
这样的东西,它将加入一系列
可观察对象

 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;
        })
 ))))
this.\u http.get(url.pipe)(
mergeMap(arr=>forkJoin(arr.map((item)=>this.\u http.get(`someurl/${item.clientId}')).pipe(map((name)=>{
item.name=名称;
退货项目;
})
))))
这里,我们使用array
map
函数将对象数组转换为
Observable
s数组。然后使用
forkJoin
将Observable数组合并为一个数组,并使用
mergeMap
将其连接到原始请求


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

这让我走得更远了,但最终没有为我返回任何内容。return programDocuments$.pipe(mergeMap(documents=>forkJoin(documents.map(item=>this.\u http.get(
employee/2079/full
)));最终返回[],我不确定why@trattles它应该返回一个您需要订阅的可观察到的对象。另一个问题是,接受ID的第二个端点只返回一个字符串-因此我需要某种方法来维护ID到响应的映射…:/它确实返回一个可观察到的对象。订阅的可观察到的对象发出[]这正是我所需要的。非常感谢。我想我现在对可见光的理解好多了。
 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;
        })
 ))))