RxJS - 每次收到新值时发出整个数组

时间:2017-11-11 19:50:26

标签: angular rxjs observable

我需要请求按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}],

2 个答案:

答案 0 :(得分:2)

Scan operator可以做到这一点:

&#13;
&#13;
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;
&#13;
&#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);
   }, []);
}

希望这会对某人有所帮助。