我正在使用显示电影放映时间的HttpClient
编写一个Angular 4应用程序。数据位于2个JSON文件中:showtimes.json
和movies.json
。
// showtimes.json
[{
"id": "2030c64ce72b4e4605cb01f2ba405b7d",
"name": "Arclight", // need to display this information
"showtimes": {
"b4c2c326a4d335da654d4fd944bf88d0": [ // need to use this id
"11:30 pm", "2:45 pm", "8:35 pm", "4:15 pm", "10:30 pm"
]
}
}]
// movies.json
[{
"b4c2c326a4d335da654d4fd944bf88d0": { // to retrieve the title, rating, and poster
"title": "Fifty Shades Darker", // needs to be displayed
"rating": "R", // needs to be displayed
"poster": "https://dl.dropboxusercontent.com/s/dt6wgt92cu9wqcr/fifty_shades_darker.jpg" // needs to be displayed
}
}]
我的服务可以检索影院的title
和name
。但是现在我必须使用showtimes
对象中的值来显示正确的标题名称。如您所见b4c2c326a4d335da654d4fd944bf88d0
是电影标题的ID,可以从movies.json
文件中检索。
到目前为止,这是我的组件
ngOnInit() {
this._moviesDataService.getShowtimes()
.subscribe(res => this.results = res)
}
这是我的服务。
getShowtimes (): Observable<ShowTimes> {
return this._http.get<ShowTimes>(this._showtimesURL)
}
我的问题是如何使用其ID检索电影的title
?这需要两个链式Observable吗?我需要循环播放电影数组吗.filter
吗?
我已经包含了我正在尝试构建
的示例答案 0 :(得分:6)
通常,当你有一个Observable时,你需要从中获取一些东西。它返回一个不同的Observable,你可以使用switchMap
:
ngOnInit() {
this._moviesDataService.getShowtimes()
.switchMap(res => {
const id = Object.keys(res[0].showtimes)[0]; // assuming you have one element in your array and you want the first id from showtimes
return this.getMovies(id); // assuming, you have a separate method that returns the movies
})
.subscribe(res => this.results = res)
}
<强>更新强>
既然你需要两个Observable的结果,但是你需要第一个请求第二个的结果,这里有一个想法,你怎么能这样做:
ngOnInit() {
this._moviesDataService.getShowtimes()
.switchMap(res => {
const showtimes = res[0].showtimes;
const id = Object.keys(showtimes)[0];
return Observable.zip(
this.getMovies(id),
Observable.of(showtimes[id])
);
})
.subscribe(([movies, showtimes]) => {
this.results.movies = movies; // or assign it to some other property
this.results.showtimes = showtimes; // and use in the template
}
答案 1 :(得分:0)
我认为因为您需要检索所有电影的标题,您必须将第一个请求的响应中的ID数组链接到一系列电影标题请求中。这样的事情:(假设你有一个类似$(".slide-button li a").on('click', function() {
var page = $('.slide-button li a').attr('data-page');
$(".slide-container .slide:not('.hide')").stop().fadeOut('fast', function() {
$(this).fadeIn('slow').removeClass('hide');
$('.slide-container .slide[data-page="' + page + '"]').addClass('hide');
});
);
的方法,根据它的id获取电影的数据并返回一个observable)
getMovieTitle
Observable.merge
的作用是this._moviesDataService.getShowtimes()
.switchMap(res => {
let resArray: any[] = res.map(
item=>this._moviesDataService.getMovieTitle(
Object.keys(item.showtimes)[0]
))
return Observable.merge(...resArray);
})
.subscribe(res => /*you will get a new res for each movie title here*/)
,因此您可以在一次订阅中获得所有结果。
注意:强>
不要忘记将所有这些内容分配给Turn multiple observables into a single observable.
并在组件的subscription
取消订阅(以防止内存泄漏)