在Angular 7中链接动态数量的HTTP调用

时间:2019-03-26 15:45:06

标签: angular rxjs

我正在开发应用程序,在以下情况下遇到了一些困难。

我有一个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
});

我该如何解决?

2 个答案:

答案 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

尝试这个expand operator example

注意: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