假设我有10个网址,我希望为每个网址发出HTTP请求.
我可以创建一个可观察的URL,然后.flatMap()是每个URL 的请求,然后.subscribe是结果.但这会立即产生所有要求.
有没有办法对固定数量的请求数量施加限制,以免使服务器过载
管道通过 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)
它是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
这个问题在这里有一个答案:how-to-limit-the-concurrency-of-flatmap 您还可以在此处查看答案并行触发异步请求,但使用 rxjs 按顺序获取结果
基本上它围绕着使用merge(withMaxConcurrency)操作符。