由两个从属组成可观察

时间:2018-07-13 15:59:15

标签: angular rxjs reactivex

我需要从另外两个Observable的值组成一个Observable。答案是 zip 运算符。但是我的情况更复杂。 我的A是 id

A {id, name, idOfRelatedB} //first observable
B {...} // second

因此,为了获取B,我需要在获取B的ID之前获取A。最后,我需要返回带有A和B的Observable。 在RX中如何处理。

我在angular / typescript中失败的解决方案:

    @Injectable()
export class StrategyResolver implements Resolve<StrategyWithSourceCode> {
  constructor(private strategyService: StrategyService) {}

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> {
    const strategyId = route.paramMap.get('strategyId');
    let sourceCodeObs: Observable<SourceCode>;
    let strategy: Strategy;

    this.strategyService.getStrategy(parseInt(strategyId)).subscribe(value => {
      strategy = value;
      sourceCodeObs = this.strategyService.getStrategySource(parseInt(strategyId), strategy.sourceCodeId);
    });
    return zip(of(strategy), sourceCodeObs, (v1: Strategy, v2: SourceCode) => ({v1, v2}));
  }
}

更新:在madjaoue用户的帮助下(感谢他)使用rxjs 6的任何特定版本的正确解决方案。

resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> {
    const strategyId = route.paramMap.get('strategyId');
    return this.strategyService.getStrategy(parseInt(strategyId)).pipe(
      concatMap(strategy => {
        let sourceCodeObs = this.strategyService.getStrategySource(parseInt(strategyId), strategy.sourceCodeId);
        return zip(of(strategy), sourceCodeObs, (v1: Strategy, v2: SourceCode) => ({v1, v2}));
      })
    )
  }

1 个答案:

答案 0 :(得分:1)

离答案还很远。这是对代码所做的轻微修改,可以完成您想要的操作。

const strategyObs = this.strategyService.getStrategy(parseInt(strategyId));

// use concatMap to combine two streams
strategyObs.concatMap(strategy => {
  let sourceCodeObs = this.strategyService.getStrategySource(parseInt(strategyId), strategy.sourceCodeId);

  // zip the response of the first service with the second 
  return zip(Observable.of(strategy), sourceCodeObs)
});
.subscribe( ([A, B]) => ...)

请注意,您可以用concatMapswitchMapmergeMap之类的其他运算符替换exhaustMap。全部将合并您的流,但方式不同。请检查concatMap是否适合您的情况。