根据 Angular 中的页面大小多次 API 调用

Multiple API calls based on page size in Angular

API 呼叫 - getList() => returns 1000 个号码

通过获取前 20 个以上的结果进行 20 API 次调用

我正在尝试做这样的事情

this.http.get('urlService').mergeMap((ids: number[]) => this.getItems(ids.slice(0, 20))).
  subscribe(newsList => {
    this.dataRecieved.next(newsList);
  })

但不知何故它不起作用

您可以使用 RxJS forkJoin 函数来合并多个 HTTP 请求。它只会在所有可观察对象完成时发出。

this.http.get('urlService').pipe(
  switchMap((ids: number[]) => forkJoin(ids.slice(0, 20).map(id => this.getItems(id))))
).subscribe(newsList => {
  // newsList[0] - response from `this.getItems(1)`
  // newsList[1] - response from `this.getItems(2)`
  ...
  this.dataRecieved.next(newsList);
});

我正在使用数组 map 函数将列表 [1, 2, ..., 20] 转换为 HTTP 请求列表 [this.getItems(1), this.getItems(2), ..., this.getItems(20)]


但是,请注意这将同时触发 20 个 HTTP 调用。大多数浏览器对可以对同一域进行多少个并发调用有一个硬性限制 (Chrome - 6)。解决此限制问题的推荐方法是使用 WebSockets 或域分片。

作为前端的解决方法,您可以使用 RxJS bufferCount operator with from 函数来控制一次发出的最大并行请求数。

this.http.get('urlService').pipe(
  switchMap((ids: number[]) => from(ids.slice(0, 20).map(id => this.getItems(id)))),
  bufferCount(6),                         // <-- adjust number of parallel requests here
  concatMap(buffer => forkJoin(buffer))
).subscribe(
  newsList => this.dataRecieved.next(newsList),
  error => // handle error
);