我正在开发应用程序,在以下情况下遇到了一些困难。
我有一个URL,该URL的末尾接受pageSize和当前页面,而我正在尝试使用该URL,从数据库表中获取所有元素的列表,而不知道我实际上有多少页面拥有(可以是一页数据,也可以是一百万页)。
例如,当我发出一个要求,例如页面大小为50和页面1的请求后,我想要接收页面2,如果页面2中包含50个元素,则接收页面3(如果它的内容小于50)元素停在那里,并最终返回到现在为止我收到的所有数据,直到我发出最后一个请求后才返回任何内容。
我试图做的是以下事情:
return this.http.get(url + currentPage, { headers }).pipe(
mergeMap((response: any) => {
managedObject = managedObject.concat(response.managedObjects);
if (response.managedObjects.length === pageSizeNo) {
currentPage++;
this.http.get(url + currentPage, { headers });
} else {
return managedObject;
}
})
);
我最初提供的URL定义为pageSizeNo = 50,并且currentPage = 1,然后在收到响应后,我想进一步查询并再次拨打电话或返回到现在为止收到的所有内容。问题在于所有内容都在第2页停止,并且不再进行呼叫。
这就是我订阅函数返回的内容的方式:
this.service.fetchData()
.subscribe((response: any) => {
this.qualityData = response
});
我该如何解决?
答案 0 :(得分:1)
使用import pandas as pd
lum_df = pd.DataFrame({'X': [1, 2, 3, 4], 'Y': [3, 4, 5, 6]})
street_df = pd.DataFrame({'X': [5, 6, 7, 8], 'Y': [9, 10, 11, 12]})
for ix, lum in lum_df.iterrows():
print(float(lum.X))
print(float(lum.Y))
for ix, point in street_df.iterrows():
print(point.X)
print(point.Y)
运算符递归调用http-get。例如:
expand
注意:return this.http.get(url + currentPage, { headers }).pipe(
expand((response: any) => {
managedObject = managedObject.concat(response.managedObjects);
if (managedObject.length === pageSizeNo) {
currentPage++;
return this.http.get(url + currentPage, { headers });
} else {
return EMPTY;
}
}),
// combine all emitted values into one array
toArray()
)
可能会泄漏,所以要小心。
答案 1 :(得分:1)
function getPage(pageNo: number): Observable<{ managedObjects: any[] }> {
return this.http.get(`url?page=${pageNo}`, { headers });
}
of([0, false, []] as [number, boolean, any[]]).pipe(
expand(([pageNo, isFinal, allResults]) => getPage(pageNo).pipe(
map(newResults => [
pageNo + 1,
newResults.managedObjects.length < 50,
[...allResults, ...newResults.managedObjects]
] as [number, boolean, any[]])
)),
takeWhile(([pageNo, isFinal, allResults]) => !isFinal, true),
last(),
map(([pageNo, isFinal, allResults]) => allResults)
).subscribe(finalResults => {
// ...
});
有关示例,请参见:https://stackblitz.com/edit/rxjs-tyuefr?file=index.ts