簡體   English   中英

RxJS-每次收到新值時發出整個數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM