通过JavaScript设计一个任务队列,控制请求的最大并发数,每个任务执行完成释放队列空间,自动执行下一个任务,直至所有任务执行完成。
要求:
1、最多只能执行10个任务
2、当前任务完成后自动释放队列空间,自动执行下一个任务
3、所有任务添加到任务队列后自动执行
function createTask(i) { // 模拟请求的异步函数
return function () {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(i)
}, 2000)
})
}
}
class TaskQueen {
constructor(max=10) {
this.max = max; // 设置最大的请求数量限制,默认值为10
this.taskList = [];
setTimeout(() => { // 此处满足要求3,利用js任务队列知识点(宏任务、微任务)
this.run()
})
}
run() {
const len = this.taskList.length; // 获取任务队列的总长度
if(len===0) return // 当任务队列长度为0,不在往下执行
const min = Math.min(this.max, len); // 当任务队列的长度小于 限制的值时取最小值
for (let i = 0; i < min; i++) {
this.max--; // 每次循环将任务队列空间减一
const task = this.taskList.shift(); // 队列特性 先进先出
task().then(res => {
console.log('res: ', res);
}).catch(e => {
console.log('e: ', e);
}).finally(() => {
this.max++; // 无论执行结果如何不管是失败还是成功,都恢复一个任务空间
this.run(); // 当有多余的任务空间时,递归执行本函数
})
}
}
addTask(task) {
this.taskList.push(task);
}
}
const taskQueen = new TaskQueen();
for (let i = 0; i < 25; i++) {
const task = createTask(i);
taskQueen.addTask(task);
}
留言