简单实现批量发送异步请求,控制并发数,完成一个请求后进行补充持续保持同等数量并发
/**
* 批量发送异步请求,控制并发数,完成一个请求后进行补充持续保持同等数量并发
* @param {array} urls 请求列表
* @param {number} num 最大并大数
*/
function batchRequest(urls, num) {
return new Promise((resolve, reject) => {
if (!Array.isArray(urls)) resolve([]);
if (!urls.length) resolve([]);
if (num <= 0) resolve([]);
let index = 0;
let result = [];
let count = 0;
const sendRequest = (i) => {
const _index = i ? i : index;
const url = urls[_index];
let status = 0; // 0 失败 1 成功
index++;
downLoadImg(url)
.then((res) => {
status = 1;
count++;
result[_index] = res;
})
.catch((err) => {
console.error(err);
})
.finally(() => {
if (count >= urls.length) {
resolve(result);
} else {
status ? sendRequest() : sendRequest(_index);
}
});
};
for (let i = 0; i < Math.min(num, urls.length); i++) {
sendRequest();
}
});
}
测试用例
const urls = [
"1.png",
"2.png",
"3.png",
"4.png",
"5.png",
"6.png",
"7.png",
"8.png",
"9.png",
"10.png",
"11.png",
"12.png",
];
const downLoadImg = (url) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(url);
Math.random() > 0.5 ? resolve(url) : reject(url);
}, 500);
});
};
batchRequest(urls, 4).then((res) => {
console.log(res);
});
运行结果
简单实现该功能,如有不足的地方,请各位大佬多多指正,谢谢。