如何使用RxJS运算符实现多个嵌套且相互依赖的订阅?

Cod*_*n25 0 observable rxjs typescript angular rxjs6

我嵌套了一些订阅,希望摆脱使用合适的RxJS运算符的麻烦。我已经尝试过concatMapmergeMap,但不幸的是我无法解决问题。

我有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
        });
      });
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

如何摆脱RxJ的嵌套?

upk*_*kit 5

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();
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)