Logo
Published on

Promise Pool

Authors
  • avatar
    Name
    Monster Cone
    Twitter

请求池是非常常见的需求,通常是为了限制并发请求数,或者控制带宽。

async pool(iterable, concurrency = 10) {
    if (typeof iterable[Symbol.iterator] !== 'function') {
        throw new Error('Invalid iterable')
        return Promise.resolve([])
    }
    const ret = [];
    const executing = new Set();
    for (const item of iterable) {
        const p = Promise.resolve(item)

        ret.push(p);
        executing.add(p);

        const clean = () => executing.delete(p);
        p.finally(clean);
        if (executing.size >= concurrency) {
            await Promise.race(executing);
        }
    }
    return Promise.all(ret);
}