![](/img/trans.png)
[英]Angular - Why ngOnInit is called every time i emit a new value?
[英]RxJS - emit whole array every time new value is received
我需要請求通過其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個完成-> [{movie1}]
2完成-> [{{movie1},{movie2}]
3完整-> [{{movie1},{movie2},{movie3}],
等等
掃描操作員可以做到這一點:
Rx.Observable.of(1, 2, 3, 4, 5) .scan((acc, v) => acc.concat(v), []) .subscribe(e => console.log(e))
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
如果有人對它在我的場景中如何工作感興趣(在多個異步請求的情況下),這就是我如何更改代碼(感謝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);
}, []);
}
希望這會幫助某人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.