Open2

[Node.js]おすすめライブラリ

しんのすけしんのすけ
export async function concurrencyPromiseAll(_promiseArray: Promise<unknown>[], _maxConcurrency = 10) {
  const maxConcurrency = _maxConcurrency;

  const concurrency = _promiseArray.length < maxConcurrency ? _promiseArray.length : maxConcurrency;

  const finalIndex = _promiseArray.length - 1;

  const promises = [];

  for (let i = 0; i < concurrency; i++) {
    const p = new Promise((resolve) => {
      const resultArray: unknown[] = [];
      // eslint-disable-next-line @typescript-eslint/no-floating-promises
      (async function loop(index) {
        if (index <= finalIndex) {
          resultArray.push(await _promiseArray[index]);
          // eslint-disable-next-line @typescript-eslint/no-floating-promises
          loop(index + concurrency);
          return;
        }

        resolve(resultArray);
      })(i);
    });

    promises.push(p);
  }

  return Promise.all(promises).then((values) => values.flat());
}