我需要从另外两个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}));
})
)
}
答案 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]) => ...)
请注意,您可以用concatMap
,switchMap
或mergeMap
之类的其他运算符替换exhaustMap
。全部将合并您的流,但方式不同。请检查concatMap
是否适合您的情况。