我用角度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个包,当一个包完成后,下一个包开始直到数组结束。
我试图使用bufferCountconcatMap但没有成功。尽管这可能是一个好的方向。应该是什么样子?

最佳答案

您可以使用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
        });
});

这是未经测试的,所以让我知道它是否有效。

10-06 11:47