// 并发请求函数
export const concurrencyRequest = (urls, maxNum) => {
return new Promise((resolve) => {
if (urls.length === 0) {
resolve([]);
return;
}
const results = [];
let index = 0; // 下一个请求的下标
let count = 0; // 当前请求完成的数量
// 发送请求
async function request() {
if (index === urls.length) return;
const i = index; // 保存序号,使result和urls相对应
const api = urls[index];
index++;
try {
const resp = await api();
// resp 加入到results
results[i] = resp;
} catch (err) {
results[i] = false;
} finally {
count++;
// 判断是否所有的请求都已完成
if (count === urls.length) {
resolve(results);
}
request();
}
}
// maxNum和urls.length取最小进行调用
const times = Math.min(maxNum, urls.length);
for(let i = 0; i < times; i++) {
request();
}
})
}
调用
const apiArr = [api] // '请求函数数组'
const maxNum = 5 // 最大并发数
concurrencyRequest(apiArr ,maxNum)