Angular2 RxJS - 分割网址集合以获取更小的块

时间:2017-03-23 15:33:40

标签: javascript angular typescript rxjs

我使用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个请求的包,当一个包完成后,下一个包开始直到数组结束。

我尝试使用bufferCountconcatMap,但没有成功。虽然这可能是个好方向。应该怎么样?

1 个答案:

答案 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
        });
});

这是未经测试的,所以请告诉我它是否有效。