一道业务场景题

47 阅读1分钟

业务场景:商品列表中, 点击商品将会进入详情页, 为了实现详情页秒开, 在点击前要预请求商品信息, 假设有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, '第一个商品发起请求'))