前端面试题-异步任务队列控制
前端面试题-异步任务队列控制
感觉面试的心里素质还是不够好,当时用的是promise.race思路,面完回来手撕了一下发现是自己想复杂了。
大致题意 1000个请求,每次发送6个,当请求发送成功时,马上发起下一个任务使得当前运行任务一直保持在6个
回来手撕了一下基本可以满足题意
const task_1 = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('第一个任务执行完成')
resolve()
}, 1000);
})
}
const task_2 = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('第二个任务执行完成')
resolve()
}, 2000);
})
}
const task_3 = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('第三个任务执行完成')
resolve()
}, 3000);
})
}
const task_4 = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('第四个任务执行完成')
resolve()
}, 4000);
})
}
const task_5 = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('第五个任务执行完成')
resolve()
}, 5000);
})
}
const task_6 = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('第六个任务执行完成')
resolve()
}, 6000);
})
}
const totalTask = [task_1, task_2, task_3, task_4, task_5, task_6]
const limit = 2
const addTask = () => {
if(!totalTask.length) return
totalTask.shift()().then(doneTask => addTask())
}
totalTask.slice(0, limit).forEach((task,taskIndex) => {
task().then(doneTask => addTask())
})
// 前limit个已经执行完成,从任务列表中去除
totalTask.splice(0,limit)