当一个 observable 依赖于另一个的结果时,避免使用 combine latest 嵌套订阅

4 rxjs angular

我想将三个 observable 合并到一个流中。然而,第三个 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
      });
  });
Run Code Online (Sandbox Code Playgroud)

car*_*ant 6

你可以使用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));
Run Code Online (Sandbox Code Playgroud)

每当组合foobarobservable 发出一个值时,baz服务将被调用,其结果将被进一步组合。

请注意,如果或observables 重新发出,switchMap将放弃挂起的baz调用。如果您不希望出现这种行为并且总是希望发出结果,请使用代替。foobarbazconcatMapswitchMap

另一种选择是使用mergeMap而不是concatMap- 后者将保证baz保留调用顺序,前者不会。