闭包实现异步并发控制的关键是封装 runningcount 和 pending 队列于私有作用域,暴露 acquire/release 接口;请求前 acquire,finally 中 release;支持多实例隔离与队列平滑调度。

用闭包处理异步请求的并发控制,关键是把“当前并发数”和“最大允许数量”封在私有作用域里,只暴露安全的操作接口,避免外部误改状态。
封装计数器与调度逻辑
用工厂函数创建独立的限流实例,内部维护 runningCount 和 pending 队列:
- 每次请求前调用 acquire() 判断是否可发起:未达上限就递增计数,返回 true
- 请求结束(无论成功或失败)必须调用 release(),递减计数并触发队列中下一个任务
- pending 队列存的是待执行的函数,不是 Promise,便于统一控制执行时机
绑定请求生命周期
不能只靠手动调用 acquire/release,要和实际请求强绑定:
- 推荐在 fetch 调用前 acquire,在 finally 块中 release,确保异常也不漏释放
- 例如:
const res = await fetch(url); ...; return res;包在 try-catch-finally 中,release 放在 finally 里 - 若用 Promise 链,可在 then/catch 后接 .finally(() => limiter.release())
支持多实例隔离与复用
每个 createRequestLimiter(max) 调用都生成全新闭包环境:
- 不同业务模块可各自创建 limiter(3)、limiter(10),互不干扰
- 图片加载、搜索建议、批量导出等场景可配不同 max,按需使用
- 函数本身无副作用,可放心多次调用,状态完全由闭包持有
配合队列实现平滑调度
当并发已满,新请求不直接拒绝,而是排队等待:
- acquire 失败时,把请求包装成函数推入 pending 数组
- 每次 release 后检查队列,若有待办任务,立即 pop 并执行
- 这样既控量,又不断流,用户体验更连贯
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











