手写实现一个异步调度器
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)
})
输出1 2
输出3 4
输出5 6
输出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)