字节跳动前端面试题
/**
* 题目: JS实现一个带并发限制的异步调度器Scheduler,保证同时运行的任务最多有两个。完善代码中Scheduler类,使得以下程序能正确输出
* 条件: 只能修改Sheduler
**/
class Scheduler {
constructor(){
this.cache = [] // 缓存任务数据
this.task = [] // 当前执行任务队列
this._max = 2 // 最大并发任务
}
add(promiseCreator) {
return new Promise(resolve=>{
promiseCreator.resolve = resolve; // 保存当前promise的状态
if(this.task.length < this._max) { // 最大并发任务处理
this.runWork(promiseCreator)
} else {
this.cache.push(promiseCreator)
}
})
}
runWork(promiseCreator) {
this.task.push(promiseCreator)
promiseCreator().then(() => {
promiseCreator.resolve()
this.task.splice(this.task.indexOf(promiseCreator), 1) // 当前任务执行完成 清除task中的数据
if(this.cache.length) {
this.runWork(this.cache.shift()) // 根据执行的缓存顺序执行,保证执行的有序性
}
})
}
}
const timeout = (time) => new Promise(resolve => {
setTimeout(resolve, time)
})
const scheduler = new Scheduler()
const addTask = (time, order) => {
const result = scheduler.add(() => timeout(time))
result.then(() => console.log(order + 'order'))
}
addTask(1000, '1')
addTask(500, '2')
addTask(300, '3')
addTask(400, '4')// output: 2 3 1 4
// 一开始,1、2两个任务进入队列
// 500ms时,2完成,输出2,任务3进队
// 800ms时,3完成,输出3,任务4进队
// 1000ms时,1完成,输出1
// 1200ms时,4完成,输出4