function batchRequest(urls, max = 6) {
// 请求并发数
const results = [];
let together = new Array(max).fill(null);
let index = 0;
// 生成promise任务 使用定时器模拟
const tasks = urls.map((item, index) => {
return function () {
return new Promise(function (resolve, reject) {
// 使用定时器 模拟请求成功和失败的结果
setTimeout(() => {
Math.random() > 0.5
? resolve({ status: "fulfilled", value: "成功", index: index + 1 })
: reject({ status: "rejected", reason: "失败", index: index + 1 });
}, Math.random() * 1000);
});
};
});
together = together.map(() => {
return new Promise((resolve, reject) => {
const run = function run() {
// 如果索引大于等于任务数量表示 全部请求已执行完成
if (index >= tasks.length) {
resolve();
return;
}
const old_index = index; // 0
// 获取当前执行任务
console.log("请求" + old_index);
const task = tasks[index++];
// 如果当前任务执行完成则执行下一个任务
task()
.then((result) => {
console.log("result", result);
results[old_index] = result;
})
.catch((reason) => {
console.log("result", reason);
results[old_index] = reason;
})
.finally(() => {
run();
});
};
run();
});
});
return Promise.all(together).then(() => results);
}
// 测试
const urls = Array.from({ length: 10 }).map((v, i) => `url_${i + 1}`);
batchRequest(urls).then((res) => {
console.log(res); // 响应结果数组
});