通过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);
}
最后修改日期: 2024年 4月 1日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。