mirror of
https://github.com/SukkaW/Surge.git
synced 2025-12-12 01:00:34 +08:00
23 lines
608 B
TypeScript
23 lines
608 B
TypeScript
const notError = Symbol('notError');
|
|
|
|
export const createMemoizedPromise = <T>(fn: () => Promise<T>, preload = true): () => Promise<T> => {
|
|
let error: Error | typeof notError = notError;
|
|
|
|
let promise: Promise<T> | null = preload
|
|
? fn().catch(e => {
|
|
// Here we record the error so that we can throw it later when the function is called
|
|
error = e;
|
|
// Here we make sure the Promise still returns the never type
|
|
throw e;
|
|
})
|
|
: null;
|
|
|
|
return () => {
|
|
if (error !== notError) {
|
|
return Promise.reject(error);
|
|
}
|
|
promise ??= fn();
|
|
return promise;
|
|
};
|
|
};
|