如何限制请求的并发数量

如何限制请求的并发数量

  • 设计思路:
  • 代码实现:


需求:当前端同时发出多个api请求,在前端对请求的并发数量进行限制,做到同时只能处理有限个请求任务

设计思路:

  • 设计 Scheduler 类 对需要发送的请求进行统一管理
  • 类中配置最大并发数 “max”,并记录正在执行的请求数目 “count”
  • 通过 await + Promise 对超出限制数量时的请求进行阻塞
  • 当正在执行的请求完成后,按顺序对阻塞的请求进行放行

代码实现:

模拟请求

function sleep(val, time) {return new Promise(reslove => {setTimeout(() => {reslove(val)}, time)})
}
function addTask(val, time) {return () => sleep(val, time).then(result => {console.log(result);return result})
}

Scheduler类实现:

class Scheduler {constructor(max) {this.max = max    // 记录支持并发的任务数量this.count = 0    // 当前正在执行的任务数this.stack = []   // 使用队列保存被阻塞任务}async add(fun) {// 当正在执行的任务个数大于最大并发数时:使用await阻塞该请求的发送,记录 reslove 到 stack 下   // 待执行中的任务完成后按顺序对 stack 中的阻塞任务放行if (this.count >= this.max) {await new Promise(reslove => this.stack.push(reslove))}this.count = this.count + 1let result = await fun()this.count = this.count - 1if (this.stack.length) this.stack.shift()()return result}
}

效果测试:

const scheduler = new Scheduler(2)
scheduler.add(addTask(1, 1000))
scheduler.add(addTask(2, 500))
scheduler.add(addTask(3, 400))
scheduler.add(addTask(4, 200))
// 打印 2 3 1 4

提示:文章到此结束,文章为个人学习记录,侵删。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部