2023-03-14

题目:


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执行完成
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容