在Angular中基于页面大小的多个API调用

在Angular中基于页面大小的多个API调用,angular,rxjs,mergemap,Angular,Rxjs,Mergemap,API调用-getList()=>返回1000个数字 比如说1,2,3…1000 通过获取前20个结果进行20次API调用 我正试着做这样的事情 this.http.get('urlService').mergeMap((id:number[])=>this.getItems(ids.slice(0,20)))。 订阅(新闻列表=>{ this.datareceived.next(新闻列表); }) 但它不知何故不起作用您可以使用RxJS函数组合多个HTTP请求。只有当所有的观测都完成时,

API调用-
getList()
=>返回1000个数字

  • 比如说1,2,3…1000
通过获取前20个结果进行20次API调用

我正试着做这样的事情

this.http.get('urlService').mergeMap((id:number[])=>this.getItems(ids.slice(0,20)))。
订阅(新闻列表=>{
this.datareceived.next(新闻列表);
})
但它不知何故不起作用

您可以使用RxJS函数组合多个HTTP请求。只有当所有的观测都完成时,它才会发射

this.http.get('urlService').pipe(
switchMap((id:number[])=>forkJoin(id.slice(0,20).map(id=>this.getItems(id)))
).订阅(新闻列表=>{
//新闻列表[0]-来自`this.getItems(1)的响应`
//新闻列表[1]-来自'this.getItems'的响应(2)`
...
this.datareceived.next(新闻列表);
});
我正在使用数组函数将列表
[1,2,…,20]
转换为HTTP请求列表
[this.getItems(1),this.getItems(2),…,this.getItems(20)]


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

作为前端的一种解决方法,您可以使用RxJS操作符和函数来控制一次发出的最大并行请求数

this.http.get('urlService').pipe(
switchMap((id:number[])=>from(id.slice(0,20).map(id=>this.getItems(id)),
bufferCount(6),//forkJoin(缓冲区))
).订阅(
新闻列表=>this.datareceived.next(新闻列表),
error=>//句柄错误
);

您能告诉我函数的签名是什么吗
getItems(id)
。它需要一个数字数组还是一个数字作为参数?