【问题标题】:RxJS - emit whole array every time new value is receivedRxJS - 每次收到新值时发出整个数组
【发布时间】:2017-11-11 19:50:25
【问题描述】:

我需要请求通过它们的 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,整个操作需要相当长的时间。并且只有在所有请求完成后才会返回结果。

是否可以让 output Observable 在每次新请求完成时发出数组?像这样:

1 完整 -> [{movie1}]

2 完整 -> [{movie1}, {movie2}]

3 完整 -> [{movie1}, {movie2}, {movie3}],

等等

【问题讨论】:

    标签: angular rxjs observable


    【解决方案1】:

    Scan operator 可以这样做:

    Rx.Observable.of(1, 2, 3, 4, 5)
      .scan((acc, v) => acc.concat(v), [])
      .subscribe(e => console.log(e))
    &lt;script src="https://unpkg.com/rxjs/bundles/Rx.min.js"&gt;&lt;/script&gt;

    【讨论】:

      【解决方案2】:

      如果有人对它在我的场景中的工作方式感兴趣(在多个异步请求的情况下),这就是我更改代码的方式(感谢 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);
         }, []);
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多