JS实现一个限流器
方法add接受一个返回Promise的函数,同时执行的任务数量不超过两个。
这个一道面试题,限流器保证同时最多只有两个任务在执行,如果任务是异步的,会等待异步任务完成之后,才去执行其他未执行任务。
class Scheduler {
constructor(maxNum) {
this.taskList = []; //{1}
this.count = 0;
this.maxNum = maxNum;
}
async add(promiseCreator) {
if (this.count >= this.maxNum) {
await new Promise((resolve) => { //{2}
this.taskList.push(resolve)
})
}
this.count ++;
const result = await promiseCreator();
this.count --;
if (this.taskList.length > 0) {
this.taskList.shift()(); //{3}
}
return result;
}
}
const scheduler = new Scheduler(2)
const timeout = (time)=>{
return new Promise(r=>setTimeout(r, time))
}
const addTask = (time, order) => {
scheduler.add(()=>timeout(time))
.then(()=>console.log(order))
}
addTask(1000, 1)
addTask(500, 2)
addTask(300, 3)
addTask(400, 4)
//log:2 3 1 4
以上是解答,关键在add方法要怎么实现。
在{1}处定义了一个任务队列。执行add方法,如果此时运行的任务超过了最大限制,就会在{2}处await一个promise,并且把promise的resolve放进任务队列中,这样这个方法就会阻塞在这里,等待promise的完成。而只有在之前的任务完成之后,会去taskList中拿resolve去执行({3}处)。执行完resolve,刚才await的promise才会继续往下执行,去执行被阻塞的任务,如此循环,直到所有任务完成。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具