diff --git a/src/util/PromiseUtil.ts b/src/util/PromiseUtil.ts index cecf47887..8d38b3ae9 100644 --- a/src/util/PromiseUtil.ts +++ b/src/util/PromiseUtil.ts @@ -1,7 +1,7 @@ import { createAggregateError } from './errors/HttpErrorUtil'; // eslint-disable-next-line @typescript-eslint/no-empty-function -const infinitePromise = new Promise((): void => {}); +function noop(): void {} /** * A function that simulates the Array.some behaviour but on an array of Promises. @@ -16,19 +16,15 @@ const infinitePromise = new Promise((): void => {}); * 2. throwing an error should be logically equivalent to returning false. */ export async function promiseSome(predicates: Promise[]): Promise { - // These promises will only finish when their predicate returns true - const infinitePredicates = predicates.map(async(predicate): Promise => predicate.then( - async(value): Promise => value ? true : infinitePromise, - async(): Promise => infinitePromise, - )); - - // Returns after all predicates are resolved - const finalPromise = Promise.allSettled(predicates).then((results): boolean => - results.some((result): boolean => result.status === 'fulfilled' && result.value)); - - // Either one of the infinitePredicates will return true, - // or finalPromise will return the result if none of them did or finalPromise was faster - return Promise.race([ ...infinitePredicates, finalPromise ]); + return new Promise((resolve): void => { + function resolveIfTrue(value: boolean): void { + if (value) { + resolve(true); + } + } + Promise.all(predicates.map((predicate): Promise => predicate.then(resolveIfTrue, noop))) + .then((): void => resolve(false), noop); + }); } /**