
本文介绍如何将异步 HTTP 请求按固定大小(如 10 个)分组并发执行,确保每批所有请求均完成后再启动下一批,避免服务端过载和请求超时。核心方法是结合 Promise.all() 与循环控制实现严格批次化调度。
本文介绍如何将异步 http 请求按固定大小(如 10 个)分组并发执行,确保每批所有请求均完成后再启动下一批,避免服务端过载和请求超时。核心方法是结合 `promise.all()` 与循环控制实现严格批次化调度。
在高并发调用受限后端服务(例如仅支持 10 线程的服务器)时,一次性发起数百个请求极易引发连接堆积、响应延迟甚至批量超时。虽然“并发限制”(如使用信号量动态调度)更符合资源利用率最优原则,但某些业务场景要求严格的批次语义:即必须等当前批次全部响应返回后,才可启动下一批——例如日志分片上报需保证批次原子性、测试中需精确观察每批负载表现,或下游系统依赖批次级事务标识。
以下是一个健壮、可复用的批次执行函数 executeInBatches:
async function executeInBatches(data, factory, batchSize = 10) {
const queue = [...data]; // 浅拷贝,避免修改原始数据
const results = [];
while (queue.length > 0) {
// 截取当前批次(不超过剩余数量)
const batch = queue.splice(0, Math.min(batchSize, queue.length));
// 并发发起本批次所有请求
const promises = batch.map(item => factory(item));
// ⚠️ 关键:await Promise.all() —— 阻塞至本批全部 resolve/reject
const batchResults = await Promise.all(promises);
results.push(...batchResults);
}
return results;
}使用示例如下(以 fetch 为例):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
async function makeRequest(url) {
try {
const res = await fetch(url, { signal: AbortSignal.timeout(10000) });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.text();
} catch (err) {
console.warn(`Request failed for ${url}:`, err.message);
throw err; // 保持 reject,使 Promise.all 失败时中断批次
}
}
const urls = [
'https://httpbin.org/delay/1',
'https://httpbin.org/delay/1',
'https://httpbin.org/delay/1',
// ... 更多 URL
];
// 执行:每批 10 个,并行请求,严格串行批次
executeInBatches(urls, makeRequest, 10)
.then(results => console.log('✅ All batches completed:', results.length))
.catch(err => console.error('❌ Batch execution failed:', err));关键注意事项:
立即学习“Java免费学习笔记(深入)”;
- ✅
Promise.all()是批次同步的核心:它会等待数组中所有 Promise 完成(成功或失败),任一拒绝将导致整批中断(如需容错,可改用Promise.allSettled()并过滤结果); - ✅
splice(0, n)原地截取并移除已处理项,确保无遗漏、无重复; - ⚠️ 若某批次中存在长期挂起的请求(如未设超时),将阻塞后续所有批次——务必为每个请求配置合理的
AbortSignal.timeout()或自定义超时逻辑; - ? 批次大小
batchSize应根据服务端实际吞吐能力(如线程数、平均响应时间)和客户端网络环境综合调整,10 是常见起点,但非绝对最优值。
该方案不依赖第三方库,纯原生 Promise 实现,兼容现代浏览器及 Node.js(≥v15.0),适用于 REST API 调用、文件上传分片、批量数据同步等典型场景。

















