xxm-test-js
Version:
xxm-js通用js工具(utils)库
40 lines • 1.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.runTasksWithConcurrency = runTasksWithConcurrency;
/**
* 并发执行一组异步任务
* @param tasks - 任务数组,每个任务都是一个返回 Promise 的函数
* @param concurrency - 允许的最大并发数
* @returns 一个包含所有任务结果的 Promise 数组
*/
async function runTasksWithConcurrency(tasks, concurrency) {
const runningTasks = [];
const results = [];
let taskIndex = 0;
const startNextTask = async () => {
if (taskIndex < tasks.length) {
const task = tasks[taskIndex++];
const promise = task()
.then((result) => {
results.push(result);
return startNextTask();
})
.catch((error) => {
console.error('任务执行出错:', error);
return startNextTask();
});
// 将 promise 转换为 Promise<T> 类型
const typedPromise = promise.then(() => undefined);
runningTasks.push(typedPromise);
if (runningTasks.length >= concurrency) {
await Promise.race(runningTasks);
}
}
};
for (let i = 0; i < concurrency; i++) {
await startNextTask();
}
await Promise.all(runningTasks);
return results;
}
//# sourceMappingURL=runTasksWithConcurrency.js.map