RX合并多个可观察量

时间:2017-01-04 13:36:02

标签: angular rxjs rxjs5

在我的代码片段中,我正在发出api请求,一切正常。我现在要检查响应以查看服务器上可用的项目总数是否大于pagesize定义的返回结果集。如果是,我想进行额外的api调用,直到检索到所有结果并作为一个响应返回给订阅者。我需要使用哪个RX运算符来完成此操作,如何在下面的api调用完成之前暂停返回响应?



    getAction<T>(path: string, params?: {}): Observable<T> {
        return this._http.get("url")
            .map(res => {
                let response = res.json();
                // If more pages available make additional api calls & return as single result
                return response;
            });
    }
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:1)

在获得所有数据之前,您应该使用switchmap从另一个observable获取响应。只需连接所有响应并将其作为最后一个observable中的响应返回。类似的东西:

//emit immediately, then every 5s
const source = Rx.Observable.timer(0, 5000);

//switch to new inner observable when source emits, emit items that are emitted
const example = source.switchMap(() => Rx.Observable.interval(500));

//output: 0,1,2,3,4,5,6,7,8,9...0,1,2,3,4,5,6,7,8
const subscribe = example.subscribe(val => console.log(val));

答案 1 :(得分:1)

查看expand

要以递归方式获取多页数据,您可以执行以下操作:

class MyExample {
  search(offset) {
    return this.http.get(`/search?offset=${offset}`);
  }

  searchAll() {
    return this.search(0)
               .expand(results => {
                 if (loadNextPage(results)) {
                   return this.search(results.nextPageOffset);
                 } else {
                   return Observable.empty();
                 }
               });
  }
}

expand允许您根据以前的结果进行一些处理(例如检查是否有更多页面),并指定Observable以获得更多结果。所有这些调用的结果将被连接起来,而不必担心将它们带到自己身上。