【问题标题】:Angular 7 - nesting ObservablesAngular 7 - 嵌套 Observables
【发布时间】:2019-10-27 14:06:43
【问题描述】:

我有一个 Angular 路由,它使用参数 :client_name,以及一个使用方法 getClientDetails(client_name) 的服务来从基于 :client_name 的 HTTP API 获取数据。两者都是独立工作的 Observable 方法,但是当我结合 2 个 observable 时,API 调用会在获取参数之前运行(client_name 未定义):

    this.route.params.subscribe(params => {
  this.client_name = params['client_name'];
  this.dataService.getClientDetails(this.client_name).subscribe(
    clientdata => {
      this.client = clientdata;
      console.log(clientdata);
    });

如何链接两个可观察对象,以便 API 仅在返回 :client_name 后运行?

【问题讨论】:

  • Hmm.. 所以getClientDetails 方法只有在定义了params['client_name'] 时才会运行?
  • @wentjun 正确。
  • 好的。如果它未定义会发生什么?您是否想触发任何特定行为?
  • 您可以查看此链接:stackoverflow.com/questions/40788163/…
  • @wentjun API 调用应该只在 params['client_name'] 被解析后运行。

标签: angular rxjs observable


【解决方案1】:

我们可以在这个场景中使用 pipeable RxJS 操作符。

首先,我们可以使用 RxJS 的 mergeMap 将来自 route 的 observable 值映射到内部 observable 中。如果定义了paramsparams['client_name'],我们将params['client_name'] 分配给client_name 属性,这与您的初始代码类似。然后,我们从dataService 调用getClientDetails() 方法。如果params 不存在,我们将null 转换为可观察对象,并返回它。

随后,可观察对象在.subscribe() 块中返回。从那里,我们可以将响应分配给client 属性。

import { mergeMap } from 'rxjs/operators';
import { of } from 'rxjs';
.
.
this.route.params.pipe(
  mergeMap(params => {
    if (params && params['client_name']) {
      this.client_name = params['client_name'];
      return this.dataService.getClientDetails(this.client_name);
    } else {
      return of(null)
    }
  })
).subscribe(response => {
  // handle the rest
  this.client = response;
})

【讨论】:

  • 如果我使用 next, error 和 complete 结构,我们可以将第二个订阅放入完整块而不是mergeMap吗?
  • @Bigeyes 嗯.. 我不建议你这样做。您可以使用mergeMap 链接嵌套操作。 complete 回调应该只用于处理有关该代码块执行完成的任何逻辑!
  • 好的。实际上,我有几个应该按顺序排列的 http 请求。我听说过 RxJS 中的 Contact,我们可以用它来将它们链接在一起吗?
  • @Bigeyes mergeMapconcat 都可以。根据具体用法,您可能需要使用combineLatestforkJoin too!如果您仍然需要这方面的帮助,也许您可​​以给我更多关于确切用法的背景信息?
  • @Bigeyes 嗯.. 在那种情况下,这真的取决于细节。例如,如果第一个 API 请求(使用 http get)返回一组数据,并且需要该数据来调用后续 API 请求(http post),则需要使用mergeMap()
猜你喜欢
  • 2019-08-04
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
相关资源
最近更新 更多