问题场景:给一个url组成的数组urls,每次最大发送maxNum个请求,等所有的请求发送完后,根据urls的数组顺序,存放每个url返回的结果。
function concurRequest(urls,maxNum){
retrun 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; // 记录当前请求的索引
const url = urls[index];
index++;
try{
const resp = await fetch(url);
results[i] = resp;
}catch(err){
results[i] = err;
}finally{
// 判断是否所有的请求都已经完成
count++;
if(count === urls.length){
reslove(results)
}
request();
}
}
const times = Math.min(maxNum,urls.length);
for(let i = 0; i < times; i++){
request();
}
request()
})
}