如何处理可观察的级联

时间:2019-06-14 11:16:25

标签: node.js asynchronous rxjs observable nestjs

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

我了解到,地图操作员允许我编辑所发出的值,以借助“人员ID”填充“父母”字段。 但是似乎两个Observable不能在map运算符中订阅:我的函数返回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字段。 (并且没有错误消息)

2 个答案:

答案 0 :(得分:0)

您可以在此处使用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;});

答案 1 :(得分:0)

对不起,我还没有50个声誉,可以对您的信息发表评论。这不是一个适当的完整答案,但我真的想推荐这篇文章:https://medium.com/@shairez/a-super-ninja-trick-to-learn-rxjss-switchmap-mergemap-concatmap-and-exhaustmap-forever-88e178a75f1b