可使用基于 Promise 队列与计数器的并发控制器实现请求限流,核心是维护运行中请求数和等待队列,确保同时执行数不超过设定上限,未达上限则立即执行,否则入队等待;函数返回 Promise,支持 Promise.all 聚合调用。

可以用一个基于 Promise 队列 + 计数器的轻量级并发控制器来实现,核心是控制同时发起的请求数不超过设定上限,其余请求排队等待。
基本思路:维护运行中请求数 + 任务队列
每次调用请求函数时,先检查当前正在执行的请求数是否已达上限。若未达上限,立即执行;否则将请求包装成 Promise 放入队列,等有请求完成后再从队列里取一个执行。
实现一个通用的并发限制器函数
下面是一个简洁可用的 concurrentLimit 工厂函数:
function concurrentLimit(max = 3) {
let running = 0;
const queue = [];
<p>return function (fn, ...args) {
return new Promise((resolve, reject) => {
const run = () => {
running++;
fn(...args)
.then(resolve)
.catch(reject)
.finally(() => {
running--;
if (queue.length > 0) queue.shift()();
});
};</p><pre class="brush:php;toolbar:false;"> if (running <p>};
}</p>使用示例(限制最多 2 个并发 fetch):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const limitFetch = concurrentLimit(2);
<p>// 发起 5 个请求,实际最多同时跑 2 个
const requests = [
limitFetch(fetch, '/api/data1'),
limitFetch(fetch, '/api/data2'),
limitFetch(fetch, '/api/data3'),
limitFetch(fetch, '/api/data4'),
limitFetch(fetch, '/api/data5')
];</p><p>Promise.all(requests).then(responses => {
console.log('全部完成', responses);
});</p>支持取消和更友好 API 的进阶写法(可选)
如果需要取消某个排队中的请求或统一 abort,可以扩展为返回带 abort 方法的对象,或集成 AbortController。但对简单场景,上面的基础版已足够稳定高效。
注意事项
- 该实现不依赖外部库,纯原生 JS,兼容性好
- 每个 limitFetch 实例独立维护自己的 running 和 queue,可多处复用不同限制值
- 错误会正常抛出,Promise.reject 会被捕获,不影响队列调度
- 避免在 fn 内部手动 catch 错误后 resolve,否则 finally 中的 running-- 仍会执行,但逻辑上可能已异常退出
不复杂但容易忽略的是:必须确保每个请求无论成功失败都触发 running-- 和队列推进,否则会卡死。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










