【问题标题】:How to deal with cascading observable如何处理级联 observable
【发布时间】:2019-06-14 11:16:25
【问题描述】:

我很难掌握可观察对象的工作方式。 我正在开发一个 API 来检索一个具有多个属性和两个“父级”的“人”。 我正在使用返回 observables 的 mssql 模块检索这些对象。 我的问题是,当我获得 Observable 时,我无法获得一个“父”对象来填充我的函数返回的“Person”(因为我正在获得另一个 Observable)。

我知道 map 运算符允许我在 Person ID 的帮助下编辑发出的值以填充父母字段。 但是在map操作符中好像不能订阅两个Observable:我的函数返回Observable而不等待父母被填满。

return this.SQLService.GetPerson().pipe(
  map((p: any): Person => {
    // This fills the Person object from the db returned object
    let returnValue = new Person(p);
    this.SQLService.GetParent(returnValue.ID).pipe(
      map((parentObj: any): Parent => { return new Parent(parentObj); })
    ).subscribe(
      (parentInstance: Parent): void => {returnValue.Parent1 = parentInstance;}
    );
  return returnValue;
})

来自同步开发,我希望我的 returnValue 实际上返回一个 Person,其中包含一个包含父级的 Person.Parent1 字段。 最后,我可以得到 Person,但没有 Parent1 字段。 (并且没有错误消息)

【问题讨论】:

  • 您可能正在寻找mergeMapconcatMap 运算符
  • @martin:我不太明白如何使用它。如果我将它放在 GetPerson 映射运算符之后(如果我理解所有内容,它将 Person 的 Observable 传递给下一个运算符),我如何返回 Parent 以放入 Person?我是否必须创建一个包含两个对象的中间对象?

标签: node.js asynchronous rxjs observable nestjs


【解决方案1】:

您可以在此处使用switchMap

然后,当您从 GetParent 映射结果时,您可以返回一个对象,其中包含来自 GetParentGetPerson 的响应。

return this.SQLService.GetPerson().pipe(
  switchMap((p: any): Person => {
    // This fills the Person object from the db returned object
    let returnValue = new Person(p);
    return this.SQLService.GetParent(returnValue.ID).pipe(
      map((parentObj: any): Parent => { return { parent: new Parent(parentObj), returnValue }; })
    );
  }),

).subscribe(({ parent, returnValue }): void => {returnValue.Parent1 = parentInstance;});

【讨论】:

  • 感谢您的帮助,它可以工作,但不确定 switchMap 与 concatMap 有何不同,但两者都是这样工作的。
  • 另外,如果您对我们如何处理其中的数组有任何指导,我会接受:My Person 之后将是一个数组,但简单的 map 不允许我循环遍历GetParent 调用
  • 另外,如果你对 RxJS Observables 的概述感兴趣,我最近自己写了一篇博文:willtaylor.blog/rxjs-observables-hot-cold-explained
  • 我会读你的文章。到目前为止,我想我错过了一些东西,在我看来,可观察对象并不意味着在后端,大多数时候我们不需要异步操作......
猜你喜欢
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 2020-12-21
相关资源
最近更新 更多