我能够链接三个http请求,每个后续请求都取决于前一个请求的结果。在以下示例中,如何展平嵌套的管道和地图?
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { map } from 'rxjs/operators';
@Component({
selector: 'app-chain-http-request',
templateUrl: './chain-http-request.component.html',
styleUrls: ['./chain-http-request.component.css']
})
export class ChainHttpRequestComponent implements OnInit {
character: any;
homeworld: any;
mostPopularMovie: any;
constructor(private http: HttpClient) { }
ngOnInit() {
this.http
.get('https://swapi.co/api/people/1')
.pipe(map((character: any) => {
this.character = character;
this.http
.get(character.homeworld)
.pipe(map((homeworld: any) => {
this.homeworld = homeworld;
this.http
.get(homeworld.films[0])
.pipe(map((mostPopularMovie: any) => {
this.mostPopularMovie = mostPopularMovie;
}))
.subscribe(() => {
console.log('mostPopularMovie loaded');
});
}))
.subscribe(() => {
console.log('homeworld loaded');
});
}))
.subscribe(() => {
console.log('people loaded');
});
}
}
答案 0 :(得分:2)
如果您想简化陈述, 这应该可以解决问题。
this.http
.get('https://swapi.co/api/people/1')
.pipe(
tap(character => console.log(character)),
switchMap((character: any) => this.http.get(character.homeworld)),
tap(homeworld => console.log(homeworld)),
switchMap((homeworld: any) => this.http.get(homeworld.films[0])),
tap(mostPopularMovie => console.log(mostPopularMovie))
).subscribe();