JS异步调度器
一个带并发限制的异步调度器,保证同时最多运行2个任务
class Scheduler { constructor(limit) { this.queue = [] this.limit = limit this.count = 0 } add(time, order) { const promiseCreator = () => { return new Promise((resolve, reject) => { setTimeout(() => { console.log(order) resolve() }, time) }) } this.queue.push(promiseCreator) } taskStart() { for(let i = 0; i < this.limit; i++) { this.request() } } request() { if (!this.queue.length || this.count >= this.limit) return this.count++ this.queue.shift()().then(() => { this.count-- this.request() }) } } // 测试代码 const scheduler = new Scheduler(2); const addTask = (time, order) => { scheduler.add(time, order); }; addTask(1000, "1"); addTask(500, "2"); addTask(300, "3"); addTask(400, "4"); scheduler.taskStart();
456
class Scheduler { constructor() { this.tasks = [], // 待运行的任务 this.usingTask = [] // 正在运行的任务 } // promiseCreator 是一个异步函数,return Promise add(promiseCreator) { return new Promise((resolve, reject) => { promiseCreator.resolve = resolve if (this.usingTask.length < 2) { this.usingRun(promiseCreator) } else { this.tasks.push(promiseCreator) } }) } usingRun(promiseCreator) { this.usingTask.push(promiseCreator) promiseCreator().then(() => { promiseCreator.resolve() this.usingMove(promiseCreator) if (this.tasks.length > 0) { this.usingRun(this.tasks.shift()) } }) } usingMove(promiseCreator) { let index = this.usingTask.findIndex(promiseCreator) this.usingTask.splice(index, 1) } } const timeout = (time) => new Promise(resolve => { setTimeout(resolve, time) }) const scheduler = new Scheduler() const addTask = (time, order) => { scheduler.add(() => timeout(time)).then(() => console.log(order)) } addTask(400, 4) addTask(200, 2) addTask(300, 3) addTask(100, 1) // 2, 4, 3, 1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」