-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpromiseSettledAggregate.ts
53 lines (45 loc) · 1.89 KB
/
promiseSettledAggregate.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/**
* Creates a Promise that is resolved after all of the input Promises have
* either fulfilled or rejected, with an array of the results if all of the
* provided Promises resolve, or rejected with an AggregateError if some
* Promises rejected.
* @param values An array of Promises.
* @returns A new Promise.
*/
async function promiseSettledAggregate<
T extends readonly unknown[] | readonly [unknown]
>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }>;
/**
* Creates a Promise that is resolved after all of the input Promises have
* either fulfilled or rejected, with an array of the results if all of the
* provided Promises resolve, or rejected with an AggregateError if some
* Promises rejected.
* @param values An array of Promises.
* @returns A new Promise.
*/
async function promiseSettledAggregate<T>(
values: Iterable<T>
): Promise<Awaited<T>[]>;
async function promiseSettledAggregate<T>(
values: Iterable<T>
): Promise<Awaited<T>[]> {
const allResults = await Promise.allSettled(values);
const rejectedOnly = allResults.filter(
(result): result is PromiseRejectedResult => result.status === "rejected"
);
if (rejectedOnly.length <= 0) {
// SAFETY: It is safe to cast to PromiseFulfilledResult because there were
// no rejected promises, and so all of them must have been fulfilled.
const allFulfilled = allResults as PromiseFulfilledResult<unknown>[];
const allFulfilledValues = allFulfilled.map((result) => result.value);
// SAFETY: It is safe to cast to Awaited<T> because we have mapped over all
// the settled results, and so the values will be in the same order and
// match the awaited type of the input promises.
return allFulfilledValues as Awaited<T>[];
}
throw new AggregateError(
rejectedOnly.map((result) => result.reason as unknown),
"Some promises were rejected"
);
}
export default promiseSettledAggregate;