2017-05-12 82 views
1

说我有返回JSON的两个API调用:合并在角两个相关API调用与观测量/ RxJS

行:

{ 
    {"row": 1, detailId: "a"} 
    {"row": 2, detailId: "b"} 
} 

rowDetails:

{ 
    details: { this row details } 
} 

我需要得到行,然后遍历每个行对象,获取detailId以对rowDetails进行另一次调用,并将详细信息附加到行对象。最终的结构需要发出像这样:

{ 
    {"row": 1, "detailId": a, "details": { row details}} 
    {"row": 2, "detailId": b, "details": { row details}} 
} 

在角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)) 

订阅刚刚发出rowDetails调用。如何迭代行调用中的每个对象,并在合并最终产品的结果时将该detailId作为另一个调用?任何帮助将不胜感激。

+0

你的第二个'get'实际上取决于第一个的结果吗?如果不是'Observable.combineLatest'似乎是最好的选择。 – jonrsharpe

+0

是的,它需要来自每个行对象的detailId进行调用以获取特定行的行详细信息 – AnotherMike

+0

因此,您想要为第一个调用的每个结果分割出一个调用,然后将所有结果合并回来? – jonrsharpe

回答

2

你需要拿每个项目,创建一个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)) 

注意,实际上,我从内map返回group。显然有很多方法可以解决这个问题,但我认为这是最简单的方法。