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()