promise模拟接口请求并发限制
需求描述:
浏览器限制每次最多发出10个请求接口,总共有1000个待请求接口,每个接口的响应时间是随机的,要保证在某个接口请求成功之后立即请求下一个接口,保证当前并发度始终为10。
function test() {
/**
* @description 发起请求任务
* @param {Numner} idx promiseArr 数组下标位置
* @param {Object} req 当前发起请求的任务信息
* @param {Number} delay 定时器延迟时间(模拟接口响应时间)
* @returns 请求任务的 promise 对象
*/
const createRequest = (idx, req, delay = 1000) => {
createdTaskCount++; // 创建成功次数+1
console.log(`下标${idx}的位置正在创建id为${req.id}个任务, 当前请求成功个数为:${finishedTaskCount}`)
const result = new Promise(resolve => {
setTimeout(() => {
resolve(req.id);
}, delay)
})
return result;
};
/**
*
* @param {Number} idx promiseArr数组下标位置
* @param {Object} req 当前请求成功的任务信息
* @returns req.id
*/
const finishedCallback = (idx, req) => { //请求成功之后的回调
finishedTaskCount++; // 请求成功次数+1
if (createdTaskCount == MAXCOUNT) {
console.log('并发请求已经全部发起');
return Promise.resolve(req.id);
}
return run(idx);
}
/**
* @description 绑定 接口 跟 回调方法
* @param {Number} idx promiseArr数组下标位置
*/
const run = (idx) => {
const req = taskQueue.splice(0, 1)[0]; // 下一个要发起的请求信息
return createRequest(idx, req, idx * Math.random() * 1000).then(() => finishedCallback(idx, req))
}
const MAXCOUNT = 20, MAXLIMIT = 10;
let taskQueue = [], promiseArr = [], createdTaskCount = 0, finishedTaskCount = 0;
for (let i = 1; i <= MAXCOUNT; i++) { // 生成任务队列
taskQueue.push({ id: i, url: `url${i}` });
}
for (let i = 0; i < MAXLIMIT; i++) { // 生成任务 promise 数组
promiseArr.push(run(i));
}
Promise.all(promiseArr).then(res => {
console.log("接口全部请求成功", res)
})
}
test();