想象一下一个使用以下条件触发的请求:
http.get('/endpoint')
想象一下10个触发的请求:
const promises = _.range(10).map(i => http.get('/endpoint'))
如果我想同时执行所有请求,通常使用
const results = await Promise.all(promises)
现在,让我们假设我只想一次执行2个请求,仅对两个项目执行Promise.all()
就足以一次仅执行2个请求,或者仍然同时触发所有请求?
const promises = _.range(10).map(i => http.get('/endpoint'))
let results = []
for (let chunk of _.chunk(promises, 2)) {
results = results.concat(await Promise.all(chunk))
}
如果它仍然同时执行10个请求,我该如何防止这种行为?
注意:_
是指lodash库,以使问题更简单
答案 0 :(得分:3)
使用bluebird Promise.map
来配置concurrency
-并发限制适用于mapper函数返回的Promises,它基本上限制了创建的Promises的数量。
Promise.map(_.range(10), () => {...}, {concurrency: 2})
答案 1 :(得分:1)
您可以使用mapLimit
中的async
。
https://caolan.github.io/async/docs.html#mapLimit
import mapLimit from 'async/mapLimit';
const ids = _.range(10);
const maxParallel = 2;
mapLimit(ids, maxParallel, (id, callback) => {
http.get(`/endpoint/${id}`)
.then(result => callback(null, result))
.catch(error => callback(error, null));
}, (error, results) {
//Some stuff
});