function runTasks(tasks, maxConcurrent) {
return new Promise((resolve, reject) => {
const results = [];
let completedCount = 0;
const startTime = Date.now();
let currentIndex = 0;
function executeNext() {
while (results.length - completedCount < maxConcurrent && currentIndex < tasks.length) {
const task = tasks[currentIndex++];
task()
.then(result => {
results.push(result);
completedCount++;
if (completedCount === tasks.length) {
const endTime = Date.now();
resolve({
totalTime: endTime - startTime,
results
});
} else {
executeNext();
}
})
.catch(error => {
reject(error);
});
}
}
executeNext();
});
}
// 示例任务函数
const taskFunctions = Array.from({ length: 1000 }, (_, i) => () => new Promise((resolve) => {
setTimeout(() => {
resolve(`Task ${i} completed`);
}, Math.random() * 1000);
}));
runTasks(taskFunctions, 10)
.then(result => {
console.log(`整体执行时间: ${result.totalTime} ms`);
console.log(`每个函数的执行结果:`, result.results);
})
.catch(error => {
console.error('执行过程中出错:', error);
});
- 原理:
runTasks
函数接受任务数组tasks
和最大并发数maxConcurrent
。
results
数组用于收集每个任务的执行结果,completedCount
记录已完成的任务数,startTime
记录开始执行时间。
executeNext
函数负责在当前并发任务数未满且还有任务待执行时,启动新的任务。每个任务执行完成后,将结果加入results
,更新完成计数。如果所有任务都完成,计算总执行时间并返回结果。
- 如果任务执行过程中出现错误,通过
reject
传递错误信息。
- 示例使用:
- 创建了1000个模拟任务,每个任务随机延迟0到1000毫秒后返回结果。
- 调用
runTasks
函数,设置最大并发数为10,并处理最终的结果和错误。