当链接带有诺言的API调用时,我会这样做:
this.http.get('/api/hello').toPromise().then(res => {
return this.http.get('/api/there/' + res.id).toPromise()
}).then(res => {
console.log('res from 2nd call', res)
}).catch(err => {
console.log('err', err)
})
当第二个响应需要第一个响应中的数据才能进行创建时,如何使用Observables这样链接API调用?
TIA
答案 0 :(得分:3)
您应使用flatMap
,请访问此网址https://stackblitz.com/edit/angular-6-rxjx-stuff。我已经创建了这个项目来测试RxJS。
您可以看到以下功能。
test__flatMap() {
const post$ = this.getPosts();
const users$ = this.getUsers();
const users2$ = this.getUsers();
post$.pipe(
flatMap(data => {
console.log('data 1 >>> ', data);
return users$;
}),
flatMap(data => {
console.log('data 2 >>> ', data);
return post$;
}),
).subscribe(data => { console.log(`In the end >>> `, data); });
}
答案 1 :(得分:1)
mergeMap
是一个选项:
this.http.get(/api/hello')
.pipe(mergeMap((s) => {
return s;
}),
mergeMap((res) =>{
const url ='/api/there/' + res.id;
return this.http.get(url).pipe(map((res) => {
return res;
}));
}))
.subscribe(res => {
console.log(res);//final response
},
undefined,
() => console.log('complete'));
答案 2 :(得分:1)
在第一次推送数据后,使用switchMap
执行另一个http.get。 switchMap
的优点是,当父级推送新数据时,它将取消所有未决的内部请求。
const request$ = this.http.get('pathto/api').pipe(
switchMap((res) => {
return this.http.get(`another/api/${res.id}`)
})
);
request$.subscribe(innerRequestData => {
// do whatever you want
});
别忘了订阅,因为否则它是冷可观察的。