【问题标题】:Combine an observable with the results of its pipe into a single observable将一个 observable 与其管道的结果组合成一个 observable
【发布时间】:2018-04-30 01:26:36
【问题描述】:

我正在使用 Angular 的 HttpClient 模块查询嵌套的 RESTful API。检索一个完整的实体需要从几个端点获取数据,这些端点存储在第一个请求的响应中。

我正在使用forkJoin 并行发送 2、3、4 等请求。这很好用,但是,我“丢失”了第一个请求的结果。我目前的解决方案是通过of() 运算符将请求的结果转换为可观察的,将其包含在forkJoin 中

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)
    );
  })
);

这会产生一个包含三个元素的数组,每个元素包含每个请求的结果。完美的。但是,“重新创建”初始 observable(通过 of(resp))感觉有点 hacky,我想知道是否有更优雅的解决方案。

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    我认为你所做的一切都很好,但我知道这看起来有点奇怪。

    因此,例如,您可以使用 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

    【讨论】:

    • 谢谢,这是个不错的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 2018-11-16
    • 1970-01-01
    相关资源
    最近更新 更多