手写实现一个异步调度器

324 阅读1分钟

手写实现一个异步调度器

function taskHandler(task) { 
    // 异步调度器实现 
}

下面是测试用例

var times = 1
var item1 = function() {
    return new Promise((resolve)=>{
        setTimeout(()=>{
            resolve(times++)
        },2000)
    })
}
var item2 = function() {
    return new Promise((resolve)=>{
        setTimeout(()=>{
            resolve(times++)
        },2000)
    })
}
var item3 = function() {
    return new Promise((resolve)=>{
        setTimeout(()=>{
            resolve(times++)
        },4000)
    })
}
var item4 = function() {
    return new Promise((resolve)=>{
        setTimeout(()=>{
            resolve(times++)
        },4000)
    })
}
var item5 = function() {
    return new Promise((resolve)=>{
        setTimeout(()=>{
            resolve(times++)
        },6000)
    })
}
var item6 = function() {
    return new Promise((resolve)=>{
        setTimeout(()=>{
            resolve(times++)
        },6000)
    })
}
var item7 = function() {
    return new Promise((resolve)=>{
        setTimeout(()=>{
            resolve(times++)
        },8000)
    })
}
var item8 = function() {
    return new Promise((resolve)=>{
        setTimeout(()=>{
            resolve(times++)
        },8000)
    })
}

taskHandler(item1).then((res)=>{
    console.log(res)
})
taskHandler(item2).then((res)=>{
    console.log(res)
})
taskHandler(item3).then((res)=>{
    console.log(res)
})
taskHandler(item4).then((res)=>{
    console.log(res)
})
taskHandler(item5).then((res)=>{
    console.log(res)
})
taskHandler(item6).then((res)=>{
    console.log(res)
})
taskHandler(item7).then((res)=>{
    console.log(res)
})
taskHandler(item8).then((res)=>{
    console.log(res)
})
//等待2s
输出1 2
//再等待4s
输出3 4
//再等待6s
输出5 6
//再等待8s
输出7 8

实现

var taskHandler = (function taskHandlerCreate(limit){
    let list = []
    let times = 0
    function startTask() {
        if(times === limit || !list.length) {
            return
        }
        let item = list.shift()
        times++
        item().then(()=>{
            times--
            startTask()
        })
    }
    return function(task) {
        return new Promise((resolve)=>{
            list.push(function(){
                return task().then((res)=>{
                    resolve(res)
                })
            })
            startTask()
        })
    }
})(2)