描述
要求最大并发数 maxNum,请求完成后返回结果。
代码
function loadImg(url) {
return new Promise((resolve, reject) => {
setTimeout(() => {
const k = Math.random() * 10;
if (k > 0.1) {
resolve(`${url}${k}`);
} else {
reject('加载失败')
}
},20)
})
}
function multiRequest(urls, maxNum) {
// 被分割的urls
const gUrls = [];
// 当前被分割的urls的下标
let index = 0;
// 若成功,返回的结果
const result = [];
// url分割
for (let i = 0; i < urls.length; i+=maxNum) {
gUrls.push(urls.slice(i, i+maxNum))
}
// 这是个Promise
return new Promise((resolve,reject) => {
// 执行函数
const request = (resolve, reject) => {
if (index < gUrls.length) {
const plist = [];
gUrls[index].forEach(item => {
plist.push(loadImg(item));
})
// 请求到之后
Promise.all(plist).then((res) => {
res.forEach(item => {
result.push(item);
})
index++;
// 放在Promise的then里,请求完这一次再执行
request(resolve, reject);
}).catch(e => {
// 失败就reject
reject(e);
});
} else {
// 所有执行完成
resolve(result);
}
}
// 开始执行
request(resolve, reject);
})
}
const urls=['1','2','3','1','2','3','1','2','3','1','2','3','1','2','3','1','2','3','1','2','3'];
multiRequest(urls,4).then(res => {
console.log(res);
}).catch(err => {
console.log(err)
});
要点
- 请求urls的分割。
- 请求完这一波,再请求下一波。
- 合并Promise。
- Promise.all进行请求。