// 并发请求函数
const concurrencyRequest = (urls, maxNum) => {
return new Promise((resolve) => {
if (urls.length === 0) {
resolve([]);
return;
}
// maxNum和urls.length取最小进行调用
const times = Math.min(maxNum, urls.length);
// 第一次调用
for(let i = 0; i < times; i++) {
request();
}
const results = [];
let index = 0; // 下一个请求的下标
let count = 0; // 当前请求完成的数量
// 发送请求
async function request() {
if (index === urls.length) return;
const i = index; // 保存序号,使result和urls相对应
const url = urls[index];
index++;
console.log(url);
try {
const resp = await fetch(url);
// resp 加入到results 推入微任务里
results[i] = resp;
} catch (err) {
// err 加入到results
results[i] = err;
} finally {
count++;
// 判断是否所有的请求都已完成
if (count === urls.length) {
console.log('完成了');
resolve(results);
}
// 递归调用
request();
}
}
})
}
// class版本 并且可以决定什么时候开始调用
// https://github.com/z-memo/interview/issues/181
console