Angular 4嵌套HTTP调用合并数据异常:仅返回20条结果求助
问题分析与解决方案
你的问题核心出在**do操作符的误用**上——do只是用来执行副作用(比如记录日志、保存变量),它不会改变或替换Observable最终发射给订阅者的值。所以你的getAll()方法实际上返回的还是第一个HTTP请求的Observable,第二个请求的结果根本没被传递到订阅流里,这就是为什么订阅时只能拿到20条数据。
修正后的代码
我们需要用mergeMap(RxJS中也可称为flatMap)来将两个HTTP请求的流合并,让最终的Observable发射合并后的40条结果:
getAll() { return this._http.get(this.baseURL) .mergeMap((data: any) => { // 保存第一页的结果和下一页token const firstPageResults = data.results; const nextPageToken = data.next_page_token; // 发起第二页请求,延迟2秒避免请求过于频繁 return this._http.get(`${this.baseURL}?next=${nextPageToken}`) .delay(2000) .map((secondPageData: any) => { // 合并两页结果并返回 return firstPageResults.concat(secondPageData.results); }); }); }
为什么这样改?
mergeMap会接收第一个请求的结果,然后返回一个新的Observable(也就是第二页的请求),最终订阅者会收到这个新Observable发射的值——也就是合并后的40条数据。- 原来的
do操作符只是在第一个请求完成后偷偷发起了第二个请求,但这个请求的结果没有和原流关联,订阅者自然拿不到。
如果以后需要获取更多页的数据(比如不止两页),可以用expand操作符来实现递归分页请求,但针对你当前只需要40条的场景,上面的代码完全够用。
内容的提问来源于stack exchange,提问作者saytri
相关产品推荐
相关产品推荐

