angular – 当一个observable取决于另一个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
      });
  });
最佳答案
您可以使用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));

每当组合的foo和bar observable发出一个值时,将调用baz服务并将其结果进一步组合.

请注意,如果foo或bar observables重新发出,switchMap将放弃挂起的baz调用.如果您不想要该行为并且始终希望发出baz结果,请使用concatMap而不是switchMap.

另一个选择是使用mergeMap而不是concatMap – 后者将保证将保留baz调用的顺序,前者不会.

转载注明原文:angular – 当一个observable取决于另一个observable的结果时,避免使用最新的嵌套订阅 - 代码日志