使用RxJS限制一次请求数

tha*_*llo 8 javascript rxjs

假设我有10个网址,我希望为每个网址发出HTTP请求.

我可以创建一个可观察的URL,然后.flatMap()是每个URL 的请求,然后.subscribe是结果.但这会立即产生所有要求.

有没有办法对固定数量的请求数量施加限制,以免使服务器过载

Eyl*_*tan 8

RxJS v6 更新

管道通过 mergeMap 与您的并行限制作为第二个参数

const MAX_PARALLEL_QUERIES = 3;
let allResults = [];
let observables = [] // fill with observables
from(observables)
            .pipe(mergeMap(observable => observable, MAX_PARALLEL_QUERIES))
            .subscribe(
                partialResults => {
                    allResults = allResults.concat(partialResults);
                },
                err => {
                    // handle error
                },
                () => {
                    // get here when all obserable has returned
                    allResults.forEach(result=> {
                        // do what you want
                    });
                }
            );
Run Code Online (Sandbox Code Playgroud)


sra*_*sra 7

它是2018年,rxjs 5就在这里,这就是我解决它的方式

urls$
  .mergeMap((url) => request({ url }), null, 10)
  .subscribe()
Run Code Online (Sandbox Code Playgroud)

mergeMap(aka flatMap)已经将"max concurrency"作为其第3个参数(参见文档)

顺便说一句.我使用universal-rxjs-ajax(the request)来实现节点兼容性,但它应该与它一样Observable.ajax


use*_*222 4

这个问题在这里有一个答案:how-to-limit-the-concurrency-of-flatmap 您还可以在此处查看答案并行触发异步请求,但使用 rxjs 按顺序获取结果

基本上它围绕着使用merge(withMaxConcurrency)操作符。