diff --git a/libraries/promise-utils/index.js b/libraries/promise-utils/index.js index c71b17127b..557210ae26 100644 --- a/libraries/promise-utils/index.js +++ b/libraries/promise-utils/index.js @@ -13,6 +13,7 @@ module.exports = { expressify, expressifyErrorHandler, promiseMapWithLimit, + promiseMapSettledWithLimit, } /** @@ -264,3 +265,19 @@ async function promiseMapWithLimit(concurrency, array, fn) { const limit = pLimit(concurrency) return await Promise.all(array.map(x => limit(() => fn(x)))) } + +/** + * Map values in `array` with the async function `fn` + * + * Limit the number of unresolved promises to `concurrency`. + * + * @template T, U + * @param {number} concurrency + * @param {Array} array + * @param {(T) => Promise} fn + * @return {Promise>>} + */ +function promiseMapSettledWithLimit(concurrency, array, fn) { + const limit = pLimit(concurrency) + return Promise.allSettled(array.map(x => limit(() => fn(x)))) +}