我用角度2.4.8。我有一组网址要取(几十个)。目前,我一次把它们全部取出,但服务器经常无法同时处理这么多的请求。当前代码:
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
但没有成功。尽管这可能是一个好的方向。应该是什么样子? 最佳答案
您可以使用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
});
});
这是未经测试的,所以让我知道它是否有效。