HTTP请求承诺和并发

时间:2019-03-26 14:47:35

标签: javascript

想象一下一个使用以下条件触发的请求:

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库,以使问题更简单

2 个答案:

答案 0 :(得分:3)

使用bluebird Promise.map来配置concurrency-并发限制适用于mapper函数返回的Promises,它基本上限制了创建的Promises的数量。

Promise.map(_.range(10), () => {...}, {concurrency: 2})

答案 1 :(得分:1)

您可以使用mapLimit中的asynchttps://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
});