我offer呢?:三面promise的题,我有遇到过类似的实现并发控制器的,不知道和楼主的是不是同一题,在这里分享下思路:
class Scheduler{
constructor(){
this.taskNum = 0;
this.taskQueue = [];
}
async add(promiseCreator){
//在Promise内部把resolve放到任务队列中,只有当resolve被调用,后面的的代码才被执行
if(this.taskNum>=2){
await new Promise((resolve)=>{
this.taskQueue.push(resolve)
})
}
this.taskNum++;
let result = await promiseCreator();
this.taskNum--;
if(this.taskQueue.length>0){
//当前任务完成后,如果任务队列里有resolve,那么就调用resolve,之前被堵住的部分就可以得到执行
this.taskQueue.shift()();
}
return result;
}
}
let scheduler = new Scheduler();
let timeout = time => new Promise((resolve)=>{
setTimeout(resolve, time);
});
function addTask(delay, num){
scheduler.add(()=>(
timeout(delay).then((val)=>{
console.log(num);
})
))
}
addTask(1000, '1');
addTask(500, '2');
addTask(300, '3');
addTask(400, '4');
投递字节跳动等公司10个岗位 >
0 点赞 评论 收藏
分享
2021-05-24 20:34
字节跳动_抖音直播_前端 0 点赞 评论 收藏
分享
关注他的用户也关注了: