Hi FE !
Ai
git
前端面试题
前端小tip
  • vite
  • webpack
npm
  • vue2
  • vue3
react
GitHub
Ai
git
前端面试题
前端小tip
  • vite
  • webpack
npm
  • vue2
  • vue3
react
GitHub
  • S035-手写一个带并发限制的异步调度器Schduler

S035-手写一个带并发限制的异步调度器Schduler

 /**
* 题目: JS实现一个带并发限制的异步调度器Scheduler,保证同时运行的任务最多有两个。完善代码中Scheduler类,使得以下程序能正确输出
* 条件: 只能修改Sheduler
**/
    class Scheduler {
        constructor() {
            this.cache = [] // 缓存任务数据
            this.task = [] // 当前执行任务队列
            this._max = 2 // 最大并发任务
        }
        add(promiseCreator) {
            return new Promise(resolve => {
                promiseCreator.resolve = resolve; // 保存当前promise的状态
                if (this.task.length < this._max) { // 最大并发任务处理
                    this.runWork(promiseCreator)
                } else {
                    this.cache.push(promiseCreator)
                }
            })
        }
        runWork(promiseCreator) {
            this.task.push(promiseCreator)
            promiseCreator().then(() => {
                promiseCreator.resolve()
                this.task.splice(this.task.indexOf(promiseCreator), 1) // 当前任务执行完成 清除task中的数据
                if (this.cache.length) {
                    this.runWork(this.cache.shift()) // 根据执行的缓存顺序执行,保证执行的有序性
                }
            })
        }
    }
    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(4000,'1')
addTask(3500,'2')
addTask(4000,'3')
addTask(3000,'4')

//Scheduler ? //4秒后打印1 //3.5秒打印2 //3进入队列,到7.5秒打印3 //...

Edit this page
最近更新: 2025/6/27 02:24
Contributors: qdleader
qdleader
本站总访问量 129823次 | 本站访客数 12人