当一个observable取决于另一个observable的结果时,避免使用最新组合的嵌套订阅

时间:2017-03-21 23:16:31

标签: angular rxjs

我想将三个可观察对象合并为一个流。然而,第三个observable需要来自第一个observable的属性 - 是否可以将所有三个结合起来以避免嵌套订阅(为了清楚起见)?

Observable.combineLatest(this.fooService.model, this.barService.model)
  .subscribe(result => {
    //do work

    this.bazService.anotherObservable(result[0].someProperty)
      .subscribe(anotherResult => {
        //do more work
      });
  });

1 个答案:

答案 0 :(得分:4)

您可以使用switchMapmap做您想做的事情:

Observable
  .combineLatest(this.fooService.model, this.barService.model)
  .switchMap(([foo, bar]) => {
    return bazService
      .anotherObservable(foo.someProperty)
      .map((baz) => [foo, bar, baz]);
  })
  .subscribe(([foo, bar, baz]) => console.log(foo, bar, baz));

每当合并的foobar可观察量值发出一个值时,baz服务将被调用,其结果将进一步合并。

请注意,如果switchMapbaz观察点重新发出,foo将放弃待处理bar次调用。如果您不想要这种行为并且始终希望发出baz结果,请使用concatMap代替switchMap

另一种选择是使用mergeMap代替concatMap - 后者将保证baz来电的顺序将被保留,而前者则不会。