将Angular中的两个相关API调用与Observables/RxJS合并

将Angular中的两个相关API调用与Observables/RxJS合并,angular,rxjs,angular2-observables,Angular,Rxjs,Angular2 Observables,假设我有两个返回JSON的API调用: 行: 行详细信息: { details: { this row details } } 我需要获取行,然后遍历每个row对象,获取detailId以再次调用rowDetails,并将细节附加到row对象。最终结构需要像这样发射: { {"row": 1, "detailId": a, "details": { row details}} {"row": 2, "detailId": b, "details": { row details}}

假设我有两个返回JSON的API调用:

行:

行详细信息:

{
  details: { this row details } 
}
我需要获取行,然后遍历每个row对象,获取detailId以再次调用rowDetails,并将细节附加到row对象。最终结构需要像这样发射:

{
  {"row": 1, "detailId": a, "details": { row details}}
  {"row": 2, "detailId": b, "details": { row details}}
}
在angular 1中,我将使用q.allSettled等待所有调用完成

我试图以可观察的方式做到这一点,我在概念上和实践上都在挣扎。我不明白你应该如何实际发出一个合并的“流”作为最终产品

我大致尝试过:

 this.http
     .get('rows')
     .map(res => res.json())
     .flatMap(group => this.http.get('rowDetails' + detailId))
     .map(res => res.json()).
     .subscribe(res => console.log(res))

Subscribe只是发出rowDetails调用。在合并最终产品的结果时,如何遍历rows调用中的每个对象,并将该detailId用于另一个调用?非常感谢您的帮助。

您需要获取每个项目,创建一个HTTP请求,在该内部请求完成后,再进一步传播更新的项目

this.http
    .get('rows')
    .map(res => res.json())
    .flatMap(group => this.http.get('rowDetails' + group.detailId)
        .map(res => {
            group.details = res.json();
            return group;
        })
    )
    .subscribe(res => console.log(res))

注意,我实际上是从内部的
映射返回
。显然有很多方法可以实现这一点,但我认为这是最简单的方法。

你的第二个
是否得到了
实际上取决于第一个的结果?如果不可观察。combineLatest似乎是最好的选择。是的,它需要来自每个行对象的detailId来进行调用,以获取特定行的行详细信息。因此,您希望为第一次调用的每个结果拆分一个调用,然后将所有结果合并在一起?是的,我相信是这样
this.http
    .get('rows')
    .map(res => res.json())
    .flatMap(group => this.http.get('rowDetails' + group.detailId)
        .map(res => {
            group.details = res.json();
            return group;
        })
    )
    .subscribe(res => console.log(res))