我需要请求按ID加载多部电影。每个请求都返回一个单独的Observable。我有以下代码:
getMoviesDataByImdbIds(ids: number[]):Observable<IMovie[]> {
return Observable.zip(ids.map( id => {
let params = new HttpParams().set('i', this.getIMDBIdString(id)).set('apikey', API_KEY);
return this.http.get(API_URL, {params}).map( data => {
return this.extractMovieData(data);
})
}));
}
由于可能有很多ID,整个操作需要很长时间。只有在所有请求完成后才会返回结果。
是否可以在每次新请求完成时使输出Observable发出数组?像这样:
1完成 - &gt; [{MOVIE1}]
2完成 - &gt; [{movie1},{movie2}]
3完成 - &gt; [{movie1},{movie2},{movie3}],
等
答案 0 :(得分:2)
Scan operator可以做到这一点:
Rx.Observable.of(1, 2, 3, 4, 5)
.scan((acc, v) => acc.concat(v), [])
.subscribe(e => console.log(e))
&#13;
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
&#13;
答案 1 :(得分:0)
如果有人对我的方案中的工作方式感兴趣(在多个异步请求的情况下),这就是我改变代码的方式(感谢Oles Savluk的回答)。修复后,我的应用程序的响应能力大大提高:
getMoviesDataByImdbIds(ids: number[]):Observable<IMovie[]> {
return Observable.of(...ids).flatMap( (id) => {
let params = new HttpParams().set('i',this.getIMDBIdString(id)).set('apikey', API_KEY);
return this.http.get(API_URL, {params}).map( data => {
return this.extractMovieData(data);
})
}).scan( (acc, movie) => {
return acc.concat(movie);
}, []);
}
希望这会对某人有所帮助。