lib/Util.ts (23 lines of code) (raw):
/**
* Like `Promise.allSettled()` but throws an error if any promises are rejected.
*/
export const allSettledWithThrow = async <R>(
promises: Promise<R>[],
): Promise<R[]> => {
const results = await Promise.allSettled(promises);
const rejected = results.filter((result): result is PromiseRejectedResult =>
result.status === "rejected"
);
if (rejected.length) {
for (const result of rejected) {
console.error(result.reason);
}
throw new Error(
`${rejected.length} promise(s) failed - see the above errors`,
);
}
// Note: TS was complaining about using `.filter().map()` here for some reason
const values: R[] = [];
for (const result of results) {
if (result.status === "fulfilled") {
values.push(result.value);
}
}
return values;
};