我使用Angular的HttpClient
模块查询嵌套的RESTful API。检索完整实体需要从多个端点获取存储在第一个请求的响应中的链接的数据。
我使用forkJoin
并行发送2,3,4等等请求。这很好,但是,我失去了"第一个请求的结果。我目前的解决方案是通过forkJoin
运算符将请求的结果转换为可观察的结果,将其包含在of()
中
this.http.post(url, geoRequest, httpOptions).pipe(
concatMap(resp => {
return forkJoin(
of(resp),
this.http.get(resp[0]["_links"].endpointA.href, httpOptions),
this.http.get(resp[0]["_links"].endpointB.href, httpOptions)
);
})
);
这会产生一个包含三个元素的数组,每个元素包含每个请求的结果。完善。然而,"重新创造"最初的可观察性(通过of(resp)
)感觉有点笨拙,我想知道是否有更优雅的解决方案。
答案 0 :(得分:3)
我认为你所做的事情非常好,但我明白它看起来很奇怪。
因此,您可以使用map
来追加/添加第一个结果:
return forkJoin(
this.http.get(...),
this.http.get(...),
)
.pipe(
map(results => [resp, ...results]),
)
forkJoin
运算符也称为"结果选择器"函数,这意味着您可以在列出所有源Observable之后使用map
回调作为最后一个参数。然而,这被删除了它RxJS 6所以你不应该再使用它了。
https://github.com/ReactiveX/rxjs/blob/master/MIGRATION.md#howto-result-selector-migration