参考 p-limit

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function pLimit(concurrent) {
let task = [], active = 0;
return fn => new Promise(res => {
task.push(async () => (active++, res(await fn()), active--, task.pop()?.()));
active < concurrent && task.pop()?.();
});
}

const limit = pLimit(2);
const fetchSome = size => fetch(`https://speed.cloudflare.com/__down?bytes=${size}`)
const input = [
limit(() => (console.log(3), fetchSome(1024 * 1024 * 3))),
limit(() => (console.log(8), fetchSome(1024 * 1024 * 8))),
limit(() => (console.log(1), fetchSome(1024 * 1024 * 1))),
limit(() => (console.log(0.1), fetchSome(1024 * 1024 * 0.1))),
limit(() => (console.log(2), fetchSome(1024 * 1024 * 2))),
limit(() => (console.log(10), fetchSome(1024 * 1024 * 10))),
];

// Only one promise is run at once
const result = await Promise.all(input);
console.log(result);