业务场景:商品列表中, 点击商品将会进入详情页, 为了实现详情页秒开, 在点击前要预请求商品信息, 假设有100个商品条目, 如果同时发起100个请求, 可能会将带宽打满, 部分设备可能还会有请求的限制, 这样会阻塞原本的其他正常请求, 因此我们需要实现一个任务调度器,确保同时最多只有2个任务在执行。
const promise = Promise.resolve()
class TaskScheduler {
constructor(maxNUm = 2) {
this.tasks = []
this.maxNum = 2
this.runningNum = 0
}
run() {
if(this.runningNum >= this.maxNum || this.tasks.length <=0) return
this.runningNumg++
const task = this.tasks.shift()
task().finally(() => {
this.runningNum--
this.run()
})
}
addTask(task) {
return new Promise((...args) => {
this.tasks.push(() => promise.then(task).then(...args))
this.run()
})
}
}
const scheduler = new TaskScheduler()
function promiseTimeout(time, label) {
console.log(label)
return () => new Promise(resolve => {
setTimeout(() => {
resolve()
},time)
}).then(()=>{
console.timeEnd(label)
})
}
scheduler.addTask(promiseTimeout(1000, '第一个商品发起请求'))
scheduler.addTask(promiseTimeout(2000, '第一个商品发起请求'))
scheduler.addTask(promiseTimeout(3000, '第一个商品发起请求'))
scheduler.addTask(promiseTimeout(4000, '第一个商品发起请求'))