我使用Angular2.4.8。我有一个url的集合来获取(几十个)。目前我一次性获取它们,但经常发生服务器无法同时处理这么多请求。目前的代码:
let collectionsRequests = Array.from(collectionsUrls, url => this.http.get(url));
Observable.forkJoin(collectionsRequests).subscribe((collectionResponses: Response[]) => {
collectionResponses.forEach(response => {
// parse responses
});
});
其中collectionsUrls
是要获取的字符串(url)数组。
我想将这些请求分成10个请求的包,当一个包完成后,下一个包开始直到数组结束。
我尝试使用bufferCount
和concatMap
,但没有成功。虽然这可能是个好方向。应该怎么样?
答案 0 :(得分:2)
您可以使用concurrent
运算符的参数mergeMap
。文档和示例here。
concurrent
参数使您可以指定在任何给定时间要执行的请求数。如果您将concurrent
设置为10,那么当第10次呼叫被发出时,您的运营商将停止,等待一个时隙空闲,然后再处理下一次呼叫。
然后,您可以将所有结果聚集在一起,例如toArray
运算符。
function identity(x) {return x}
Rx.Observable.from(collectionsUrls)
.mergeMap(url => this.http.get(url), identity, 10).toArray()
.subscribe((collectionResponses: Response[]) => {
collectionResponses.forEach(response => {
// parse response
});
});
这是未经测试的,所以请告诉我它是否有效。