面试情景模拟:
假设有100个请求 要求每次并发数是3,要求按照请求的顺序返回相对应位置的顺序
假设A,B,C 并发三个请求
C先请求成功 进入到resC,D直接补位
依次类推 知道数量全部被请求完
代码如下 :
const urls = [];
for (let i = 0; i <= 100; i++) {
urls.push(`https://ifarm.lovol.com/testapi/cfbusiservice/refund/getRefundList${i}`);
}
concurRequest(url, 3).then((resps) => {
console.log(resps);
});
封装后的concurRequest:
function concurRequest(url, maxNum) {
if (urls.length === 0) return Promise.resolve([]);
return new Promise((resolve) => {
let index = 0; //指向下一次请求的url对应的下标
const result = []; //储存所有的请求结果
let count = 0; // 当前完成的请求数量
async function _request() {
const i = index;
const url = urls[index];
index++;
try {
const resp = await fetch(url);
result[i] = resp;
} catch (err) {
result[i] = err;
} finally {
count++;
if (count === urls.length) {
resolve(result);
}
if (index < url.length) {
_request();
}
}
}
for (let i = 0; i < Math.min(urls.length,maxNum); i++) {
_request();
}
});
}
结:自行试验