什么是链接一系列HttpClient调用的“最佳实践”(假设当前调用取决于先前调用的结果)?以下解决方案是有效的,但显然不建议这样做。每个get返回一个Observable。在解决方案(RxJs中的较新方法)中首选使用“管道”运算符。
ngOnInit() {
this.firstService.get().subscribe((first) => {
this.secondService.get().subscribe(second => {
this.thirdService.get().subscribe(third => {
... possibly more nested calls ...
})
})
})
}
答案 0 :(得分:4)
您的代码远远超出了最佳实践。永远不要在另一个内部进行订阅。
如果您的任务是三个相互独立的独立任务/可观察对象,请考虑使用forkJoin
(所有可观察对象同时开始,并且最后一个可观察对象完成时返回结果)
let observable1(param1);
let observable2(param2);
let observable3(param3);
let joinedObservables = forkJoin(observable1, observable2, observable3).subscribe(x => {
let result1 = x[0];
let result2 = x[1];
let result3 = x[2];
...
});
如果它们的结果相互依赖,则可以使用switchMap
,flatMap
,mergeMap
,exhaustMap
(检查差异)
let resultObservable = return this.observable1().pipe(mergeMap((param1) => {
return this.observable2().pipe(map((param1) => {
....
return <result>;
}));
}));
resultObservable.subscribe(x => {
...
});
答案 1 :(得分:1)
如果需要嵌套调用的原因是使用先前调用中的数据,则建议将管道运算符与mergeMaps和更多管道/映射一起使用,以代替下一个调用返回下一个调用。
应该类似于(省略订阅和取消订阅):
this.firstService.pipe(
mergeMap(res =>
this.secondService.get().pipe(
map(data => data),
),
... <more as needed>
);
如果不需要嵌套它们,那么在promiseAll内部执行this.service.get().toPromise()
会更容易。