将一个observable与其管道的结果组合成一个可观察的

时间:2018-04-29 16:50:54

标签: angular rxjs

我使用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))感觉有点笨拙,我想知道是否有更优雅的解决方案。

1 个答案:

答案 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