type promiseFun = () => Promise<number>
const requestList: promiseFun[] = []
for (let i = 1; i <= 100; i++) {
requestList.push(() => {
return new Promise((resolve) => {
setTimeout(() => {
console.log("接口请求完成");
resolve(i)
}, Math.random() * 1000)
})
})
}
第一种方法
const concurrenceRun = async (requestList: promiseFun[], max: number) => {
const runList: promiseFun[][] = []
for (let i = 0; i < requestList.length; i += max) {
console.log(i);
runList.push(requestList.slice(i, max + i))
}
for (let i = 0; i < runList.length; i++) {
const res = await Promise.allSettled(runList[i].map(fn => fn()))
console.log(res);
}
}
concurrenceRun(requestList, 5)
第二种方法
const pool = new Set();
const waitQueue:Function[] = [];
const request = (reqFn:promiseFun, max:number) => {
return new Promise((resolve, reject) => {
const isFull = pool.size >= max;
const newReqFn = () => {
reqFn()
.then(res => {
resolve(res);
})
.catch(err => {
reject(err);
})
.finally(() => {
pool.delete(newReqFn);
const next = waitQueue.shift();
if (next) {
pool.add(next);
next();
}
});
};
if (isFull) {
waitQueue.push(newReqFn);
} else {
pool.add(newReqFn);
newReqFn();
}
});
};
requestList.forEach(async item => {
const res = await request(item, 10);
console.log(res);
});