在我的代码片段中,我正在发出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;
答案 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
以获得更多结果。所有这些调用的结果将被连接起来,而不必担心将它们带到自己身上。