Angular 如何使用RxJS操作符实现多个嵌套和相互依赖的订阅?

Angular 如何使用RxJS操作符实现多个嵌套和相互依赖的订阅?,angular,typescript,rxjs,observable,rxjs6,Angular,Typescript,Rxjs,Observable,Rxjs6,我有嵌套订阅,我想使用合适的操作符来摆脱它。我已经尝试过了,但不幸的是,我无法解决我的问题 我有3个相互依赖的订阅,它们在forEach循环中为当前循环的每个值触发一个新的可观测值。为了更详细地说明这一点,以下是我的示例代码: this.subscriptionOne = this.serviceOne.getStreets().subscribe((streets) => { streets.forEach((street) => { this.subscription

我有嵌套订阅,我想使用合适的操作符来摆脱它。我已经尝试过了,但不幸的是,我无法解决我的问题

我有3个相互依赖的订阅,它们在forEach循环中为当前循环的每个值触发一个新的可观测值。为了更详细地说明这一点,以下是我的示例代码:

this.subscriptionOne = this.serviceOne.getStreets().subscribe((streets) => {
  streets.forEach((street) => {
    this.subscriptionTwo = this.serviceTwo.getMetaData(street.id).subscribe((metaDatas) => {
      metaDatas.forEach((md) => {
        // do some stuff and then trigger another observable..
        this.subscriptionThree = this.serviceTwo.getStuff(md.id, md.type, md.name).subscribe((stuff) => {
          // do some other stuff
        });
      });
    });
  });
});
我怎样才能摆脱RxJs的嵌套

let sub = this.serviceOne
  .getStreets()
  .pipe(
    mergeMap(streets => {
      return from(streets);
    }),
    mergeMap(street => {
      return this.serviceTwo.getMetaData(street.id);
    }),
    mergeMap(metaDatas => {
      return from(metaDatas);
    }),
    mergeMap(md => {
      return this.serviceTwo.getStuff(md.id, md.type, md.name);
    }),
    map(stuff => {
      // do your stuff
    })
  )
  .subscribe();
metaDatas
在最后两个操作符中可用:

let sub = this.serviceOne
  .getStreets()
  .pipe(
    mergeMap(streets => {
      return from(streets);
    }),
    mergeMap(street => {
      return this.serviceTwo.getMetaData(street.id);
    }),
    mergeMap(metaDatas => {
      return from(metaDatas).pipe(
        mergeMap(md => {
          return this.serviceTwo.getStuff(md.id, md.type, md.name);
        }),
        map(stuff => {
          // do your stuff
        })
      );
    })
  )
  .subscribe();

这样就不需要再磨了?那可能是我的错。。稍后我将测试您的方法并给您反馈。非常感谢。是的,您不再需要
forEach
。是否还有方法合并最后两个mergeMap,或者我仍然可以访问/迭代subscribe函数中的“metaDatas”?因为在上一个mergeMap中调用getStuff()后,我仍然需要“metaDatas”中的一些属性来生成最终对象的选项。您可以在变量中保留
metaDatas
,该变量属于包含整个订阅的方法,当然,您可以将最后两个运算符包含在父运算符中。如果您要展开数组,如
streets
,则必须使用
from(streets)
将它们转换为可观察的对象,或者您只需返回一个数组,
mergeMap
将分别重新发出每个项目
mergeMap(streets=>streets)
(好吧,或者改用
mergeAll
)。