promise实现并发控制
时间: 2024-05-25 15:06:15 浏览: 73
pqueue利用并发控制的Promise队列
使用Promise实现并发控制时,可以维护一个任务队列和一个并发池。首先将所有的任务放入任务队列中,然后从任务队列中取出一定数量的任务放入并发池中执行。当有任务执行完成后,从并发池中移除该任务,并将任务队列中的下一个任务放入并发池中执行。通过这种方式,可以实现对并发数量的控制。具体实现可以参考以下代码:
```
function sendRequest(requestList, limits, callback) {
const promises = []; // 维护一个promise队列
const pool = new Set(); // 当前的并发池,用Set结构方便删除
// 开始并发执行所有的任务
for (let request of requestList) {
// 开始执行前,先await判断当前的并发任务是否超过限制
if (pool.size >= limits) {
// 这里因为没有try catch,所以要捕获一下错误,不然影响下面微任务的执行
await Promise.race(pool).catch(err => err); }
const promise = request(); // 拿到promise
// 删除请求结束后,从pool里面移除
const cb = () => {
pool.delete(promise);
};
// 注册下then的任务
promise.then(cb, cb);
pool.add(promise);
promises.push(promise);
}
// 等最后一个for await结束,这里是属于最后一个await后面的微任务
// 注意这里其实是在微任务当中了,当前的promises里面是能确保所有的promise都在其中(前提是await那里命中了if)
Promise.allSettled(promises).then(callback, callback);
}
```
阅读全文