要求:实现一个批量请求函数 multiRequest(urls, maxNum),要求最大并发数 maxNum,每当有一个请求返回,就留下一个空位,可以增加新的请求,所有请求完成后,结果按照 urls 里面的顺序依次打出。
// 模拟ajax请求
function majax(url) {
return new Promise((resolve, reject)=>{
setTimeout(() => {
const res = {
req: url,
res: `回应:${url}`
}
resolve(res);
}, Math.floor(Math.random() * 1000) + 600);
})
}
// 批量请求切控制并发数
function multiRequest(urls, maxNum) {
return new Promise((resolve, reject) => {
let _urls = [...urls]
let _ress = {}
let stackNum = 0;
let _rsl = [];
// 添加一个新的请求
let addXhr = function () {
// 队列已满或没有待请求
if (stackNum >= maxNum || _urls.length == 0) return;
const __path = _urls.shift();
stackNum ++;
console.log(`${__path} begin!`)
majax(__path).then(res => {
_ress[__path] = res;
console.log(`${__path} over!`)
stackNum --;
if (stackNum == 0 && _urls.length == 0) {
// 所有请求全部返回完毕
for (let i=0;i<urls.length;i++) {
_rsl.push(_ress[urls[i]])
}
resolve(_rsl);
} else {
addXhr();
}
})
}
while (stackNum < maxNum) {
addXhr();
}
})
}