axios并发请求
废话不多说,直接上代码~
/**
* 并发请求多个资源,一次最多并发 maxRequestNumber 个请求
* 如果出现错误则重试,最多重试 maxRetries 次,超过次数则抛出异常
* @param {string[]} urls
* @param {number} maxRequestNumber = 5
* @param {number} maxRetries = 3
* @preturn {Promise}
*/
const axios = require("axios");
function preload(urls, maxRequestNumber = 5, maxRetries = 3) {
return new Promise((resolve, reject) => {
let completed = 0;
let retried = 0;
let errRequest = [];
function handleRequest(url) {
// 发送请求
axios.get(url)
.then(() => {
completed++;
if (completed === urls.length) {
if (errRequest.length > 0) {
reject(new Error(`Failed to load ${errRequest.length} requests`))
} else {
resolve();
}
} else {
// 还有请求需要处理
handleNextRequest();
}
})
.catch((err) => {
errRequest.push({ url, err });
if (retried < maxRetries) {
// 重发
retried++;
handleRequest(url);
} else {
// 抛出异常
reject(new Error(`Falied to load request: ${url}`))
}
})
}
function handleNextRequest() {
if (urls.length > 0) {
handleRequest(urls.shift());
}
}
// 开始发送请求
for (let i = 0; i < maxRequestNumber; i++) {
handleNextRequest();
}
})
}
使用例子:
const urls = [
'https://example.com/resource1',
'https://example.com/resource2',
'https://example.com/resource3',
'https://example.com/resource4',
'https://example.com/resource5',
'https://example.com/resource6',
];
preload(urls)
.then(() => {
// 处理
console.log('加载完毕');
})
.catch((error) => {
// ...
console.error(`失败:${error.message}`);
});