js实现一个带并发限制的异步调度器scheduler

//js实现一个带并发限制的异步调度器scheduler,保证同时运行的任务最多有两个。 //www.nowcoder.com/discuss/599...

js 复制代码
class Scheduler {
    constructor() {
        this.limit = 2
        this.runningCount = 0
        this.taskQueue = []
    }
    add(promiseCreator) {
        return new Promise((resolve, reject) => {
            const taskWrapper = () => { //wrapper 封套
                promiseCreator()
                .then(resolve)
                .catch(reject)
                .finally(() => {
                    this.runningCount -= 1 // 任务完成后, 当前运行任务数减1
                    this.schedule(); // 调度下一个任务执行
                })
            }
            this.taskQueue.push(taskWrapper); // 将任务包装成函数并加入任务队列
            this.schedule();
        })
    }

    schedule() { 
        if (this.runningCount >= this.limit || this.taskQueue.length === 0) return // 达到并发限制或者队列为空时, 不再调度任务
        const task = this.taskQueue.shift(); 
        this.runningCount -= 1;
        task();
    }

}

const timeout = (time) => new Promise(resolve => {
    setTimeout(resolve, time)
})

const scheduler = new Scheduler()
const addTask = (time, order) => {
    scheduler.add(() => timeout(time))
        .then((res) => {
            console.log(order)
           // console.log(res)
        })
}

addTask(1000, '1')
addTask(500, '2')
addTask(300, '3')
addTask(400, '4')// output: 2 3 1 4// 一开始,1、2两个任务进入队列// 500ms时,2完成,输出2,任务3进队// 800ms时,3完成,输出3,任务4进队// 1000ms时,1完成,输出1// 1200ms时,4完成,输出4
相关推荐
不好听6135 小时前
从一行 JSX 到屏幕像素:前端开发者必须懂的浏览器渲染管线
前端
恒拓高科WorkPlus5 小时前
企业级内网即时通讯建设模型:BeeWorks内网IM四层架构
前端
前端小李子6 小时前
前端环境变量裸奔?我用 EnvShield 给它穿了件防弹衣
前端
youtootech6 小时前
HarmonyOS《柚兔学伴》项目实战25-我的页面、Web 嵌入与项目总结
前端·华为·harmonyos
小林ixn6 小时前
从零到一理解 React 父子组件通信:手写一个 Todo 应用带你彻底搞懂单向数据流
前端·javascript·react.js
醇氧8 小时前
CountDownLatch / CyclicBarrier / Semaphore 面试高频问答清单
前端·面试·职场和发展
qetfw9 小时前
MXU:Tauri 2 + React 的 MaaFramework 跨平台 GUI 源码
前端·python·react.js·前端框架·开源项目·效率工具
甲维斯9 小时前
我要开始吹牛逼了!Kimi K3 “宇宙无敌”!
前端·人工智能
a1117769 小时前
微光小屋-前端养成小游戏 开源项目
前端