3-6 实现请求调度器


JS 天然支持并行请求,但与此同时会带来一些问题,比如会造成目标服务器压力过大,所以本文引入“请求调度器”来节制并发度。

class Scheduler {
    constructor(size) {
        this.size = size;
        this.stacks = [];
        this.count = 0;
    }

    add(fn) {
        this.stacks.push(fn)
    }

    start() {
        for (let index = 0; index < this.size; index++) {
            this.request()
        }
    }

    request() {
        if(!this.stacks.length || this.count >= this.size) return
        this.count ++;
        this.stacks.shift().then(res => {
            this.count --;
            console.log(res, this.count)
            this.request()
        })
    }

}


const scheduler = new Scheduler(2);

const addTask = (fn) => {
    scheduler.add(fn)
}

// 模拟请求的接口返回的是一个 Promise
const request = function(fn, time) {
    return new Promise((reslove, reject) => {
        setTimeout(() => {
            try {
                const result = fn && fn()
                reslove(result)
            } catch (error) {
                reject(error)
            }
        }, time)
    })
}

addTask(request(() => 2, 2000))
addTask(request(() => 3, 2000))
addTask(request(() => 4, 4000))
addTask(request(() => 5, 4000))

addTask(request(() => 2, 6000))
addTask(request(() => 3, 6000))
addTask(request(() => 4, 8000))
addTask(request(() => 5, 8000))

scheduler.start()

相关