Skip to content

基于 async 和 await 的异步调度器

  • 可以通过初始化设置并发数
  • 巧妙的地方就在resolve什么时候执行上
  • 当前对js执行机制要非常熟悉
js
class Scheduler {
    constructor(maxNum) {
        this.maxNum = maxNum
        this.taskList = []
        this.count = 0
    }

    async add(fn) {
        if (this.count >= this.maxNum) {
            await new Promise(resolve => {
                this.taskList.push(resolve) //重点就在用resolve来阻塞执行
            })
        }
        this.count++;
        const result = await fn(); //遇到这个就交出控制权
        this.count--
        if (this.taskList.length > 0) {
            this.taskList.shift()();
        }
    }
}