使用 promise.all() 结合数组切片或索引映射,可以将异步操作按固定数量分组并行执行。具体做法是将待处理的任务列表切分为多个子数组,对每个子数组调用 promise.all() 获取组内结果,最后再用一个外层的 promise.all() 等待所有组完成,从而在控制并发量的同时实现并行分组。

如何将任务列表切分为固定大小的组
通过计算组数和循环切片,可以将长任务列表拆分为多个小数组。例如将 10 个任务每 3 个一组,会得到 [3, 3, 4] 的分布。核心逻辑是遍历原数组,每次取出指定数量的元素组成新数组,直到所有任务被分配完毕。

function chunkArray(arr, size) {
const chunks = [];
for (let i = 0; i < arr.length; i += size) {
chunks.push(arr.slice(i, i + size));
}
return chunks;
}
const tasks = [1, 2, 3, 4, 5];
console.log(chunkArray(tasks, 2)); // [[1, 2], [3, 4], [5]]如何并行执行各组并收集结果
对每个切分后的子数组应用 Promise.all(),生成一组 Promise,再将这些组 Promise 放入外层 Promise.all() 中统一等待。这样每组内部并行,组与组之间也并行(受限于全局并发池时则串行),最终返回嵌套的结果数组。
立即学习“Java免费学习笔记(深入)”;

async function runInGroups(tasks, groupSize, asyncFn) {
const chunks = chunkArray(tasks, groupSize);
const groupPromises = chunks.map(chunk =>
Promise.all(chunk.map(task => asyncFn(task)))
);
return Promise.all(groupPromises);
}
// 示例:每2个任务并行,共3组
runInGroups([1, 2, 3, 4, 5], 2, async x => x * 2)
.then(results => console.log(results)); // [[2, 4], [6, 8], [10]]当某组包含空值或异常时如何处理
如果任务列表中混入 null、undefined 或抛出异常的函数,Promise.all() 会立即拒绝整个组。为避免单点失败影响整批数据,应在组内使用 Promise.allSettled() 包裹,或在调用前过滤无效输入。例如用 filter(Boolean) 剔除空值,或用 try-catch 包装单个任务。


















