2023-03-14

2023-03-13  本文已影响0人  LuckySunSet

题目:


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执行完成
上一篇下一篇

猜你喜欢

热点阅读