使用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));

posted @ 2024-12-14 09:06  王铁柱6  阅读(78)  评论(0)    收藏  举报