并发请求
Code
ts
/**
* 并发请求
* @param {string[]} urls 待请求的 url 数组
* @param {number} maxNum 最大并发数
*/
function concurRequest(urls, maxNum) {
return new Promise((resolve) => {});
}
解析
ts
function concurRequest(urls, maxNum) {
if (urls.length === 0) return Promise.resolve([]);
return new Promise((resolve) => {
let index = 0; // 指向下一次请求的 url 对应的下标
const result = []; // 存储所有请求的结果
async function _request() {
const i = index;
const url = urls[index];
index++;
try {
const resp = await fetch(url);
result.push({
index: i,
response: resp
})
} catch (err) {
result.push({
index: i,
response: err
})
} finally {
if (result.length === urls.length) {
resolve(result.sort((a, b) => a.index - b.index).map(x => x.response))
}
if (index < urls.length) {
_request();
}
}
}
for (let i = 0, len = Math.min(maxNum, urls.length); i < len; i ++) {
_request();
}
});
}