console
function asyncPool(poolLimit, urls, request) {
let i = 0;
const ret = [];
const executing = [];
const enqueue = function () {
if (i === urls.length) return Promise.resolve();
const item = urls[i++];
const p = Promise.resolve().then(() => request(item));
ret.push(p);
executing.push(p);
p.then(() => executing.splice(executing.findIndex(p), 1));
let r = Promise.resolve();
if (executing.length >= poolLimit) {
r = Promise.race(executing);
}
return r.then(() => enqueue());
};
return enqueue().then(() => Promise.all(ret));
}
let arr = [];
let index = 0;
while (index < 10) {
index++;
arr.push(index);
}
asyncPool(3, arr, (param) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(param);
}, Math.floor(Math.random() * 5 + 1) * 1000);
});
})
.then((res) => {
console.log("res", res);
});
<div>请查看控制台</div>