【发布时间】:2018-11-30 09:20:44
【问题描述】:
我想我已经阅读了 100 多篇关于该主题的帖子,但我仍然无法弄清楚如何在 Angular 6 中使用 rxjs 链接两个 HttpClient 调用。
假设我有一个带有该签名的服务:
GeoService {
getState(): Observable<string> {
return this.http.get<string>(stateURL);
}
getCities(state: string): Observable<string[]> {
return this.http.get<string[]>(citiesURL + state);
}
}
我一辈子都不知道如何在我的组件中获取状态和相应的城市列表:
import { Observable } from 'rxjs';
import { map, flatMap, mergeMap, filter, switchMap } from 'rxjs/operators';
...
ngOnInit() {
this.svc.getState().
pipe(map((state) => {
this.state = state;
return this.svc.getCities(state);
}),
mergeMap((cities) => this.cities = cities))
).
subscribe(console.log('done'));
上面的代码是我 20 次以我能想到的各种方式组合 pipe/map/mergeMap/subscribe 的随机尝试之一......非常感谢一个工作示例:)
谢谢!
编辑:“可能重复”的帖子均不包含有效的实际示例
【问题讨论】:
-
您可以通过将第二个(和第三个等)调用放入订阅前一个调用的 res 部分(如果不需要 res 值,则完成)来链接它们。例如:
this.svc.getState().subscribe(res=>{this.svc.getCities(res).subscribe(res=>{},err=>{},()=>{})},err=>{},()=>{}) -
@ggradnig 我不会这么说,你可以从 http 调用的订阅部分做到这一点
-
this.svc.getState().pipe(mergeMap(state => this.svc. getCities(state))).subscribe(...) -
@martin 您需要订阅
getCities()调用,否则它实际上不会进行 http 调用