使用js实现一个并发限制的promise,并保证最多同时运行三个任务
class ConcurrencyLimiter {
constructor(limit) {
this.limit = limit;
this.activeCount = 0;
this.queue = [];
}
async run(task) {
return new Promise((resolve, reject) => {
this.queue.push({ task, resolve, reject });
this.next();
});
}
next() {
while (this.activeCount < this.limit && this.queue.length > 0) {
const { task, resolve, reject } = this.queue.shift();
this.activeCount++;
task()
.then(resolve)
.catch(reject)
.finally(() => {
this.activeCount--;
this.next();
});
}
}
}
// 使用示例:
const limiter = new ConcurrencyLimiter(3); // 最大并发数为 3
const tasks = [
() => new Promise(resolve => setTimeout(() => resolve(1), 1000)),
() => new Promise(resolve => setTimeout(() => resolve(2), 500)),
() => new Promise(resolve => setTimeout(() => resolve(3), 800)),
() => new Promise(resolve => setTimeout(() => resolve(4), 300)),
() => new Promise(resolve => setTimeout(() => resolve(5), 1200)),
() => new Promise(resolve => setTimeout(() => resolve(6), 700)),
() => new Promise(resolve => setTimeout(() => resolve(7), 900)),
() => new Promise(resolve => setTimeout(() => resolve(8), 400)),
];
const results = [];
for (const task of tasks) {
const result = limiter.run(task);
results.push(result);
}
Promise.all(results)
.then(values => console.log("所有任务完成:", values))
.catch(error => console.error("任务执行出错:", error));
浙公网安备 33010602011771号