美文网首页
2023-03-14

2023-03-14

作者: LuckySunSet | 来源:发表于2023-03-13 09:43 被阅读0次

    题目:

    
    class SuperTask {
        add(task) {
        }
    }
    
    function timeout(time) {
        return new Promise(function (resolve) {
            setTimeout(()=>resolve(), time);
        });
    }
    const superTask = new SuperTask();
    function addTask(time, name) {
        superTask
        .add(() => timeout(time))
        .then(() => {
            console.log(`任务${name}执行完成`);
        });
    }
    
    addTask(10000, 1); // 10000ms 后输出:任务1执行完成
    addTask(5000, 2);  // 5000ms  后输出:任务2执行完成
    addTask(3000, 3);  // 8000ms  后输出:任务3执行完成
    addTask(4000, 4);  // 12000ms 后输出:任务4执行完成 
    addTask(5000, 5);  // 15000ms 后出手:任务5执行完成
    

    答案:

    
    class SuperTask {
        constructor(parallelCount = 2) {
            this.parallelCount = parallelCount; // 并发数量
            this.runnintCount = 0; // 正在运行的任务数量
            this.tasks = []; // 任务列表
        }
        add(task) {
            return new Promise((resolve, reject) => {
                this.tasks.push({ task, resolve, reject });
                this._run();
            });
        }
        
        _run() {
            while (this.parallelCount > this.runnintCount && this.tasks.length >= 1) {
                this.runnintCount++;
                const {task, resolve, reject } = this.tasks.shift();
                task().then(resolve, reject).finally(() => {
                    this.runnintCount--;
                    this._run();
                })
            }
        }
    }
    
    function timeout(time) {
        return new Promise(function (resolve) {
            setTimeout(()=>resolve(), time);
        });
    }
    const superTask = new SuperTask();
    
    function addTask(time, name) {
        superTask
        .add(() => timeout(time))
        .then(() => {
            console.log(`任务${name}执行完成`);
        });
    }
    
    addTask(10000, 1); // 10000ms 后输出:任务1执行完成
    addTask(5000, 2);  // 5000ms  后输出:任务2执行完成
    addTask(3000, 3);  // 8000ms  后输出:任务3执行完成
    addTask(4000, 4);  // 12000ms 后输出:任务4执行完成 
    addTask(5000, 5);  // 15000ms 后出手:任务5执行完成
    

    相关文章

      网友评论

          本文标题:2023-03-14

          本文链接:https://www.haomeiwen.com/subject/wxhcrdtx.html