- cache-invalidation: extract isExpectedRevalidateError helper - integration-data-cache: flatten early-return chain, extract eviction - redis-handler: extract StoredEntry type, readStreamBody, ensureConnected - svg-purify: single getOwnPropertyDescriptor lookup per prop - session-scoped-providers: simplify auth flow - retryable-loader: use function declarations - translation/request: replace spread-in-reduce with for loop
19 lines
580 B
TypeScript
19 lines
580 B
TypeScript
export function createRetryableLoader<TKey, TValue>(loaders: ReadonlyMap<TKey, () => Promise<TValue>>) {
|
|
const promises = new Map<TKey, Promise<TValue>>();
|
|
|
|
return function load(key: TKey) {
|
|
const existing = promises.get(key);
|
|
if (existing) return existing;
|
|
|
|
const loader = loaders.get(key);
|
|
if (!loader) throw new Error(`No loader is registered for ${String(key)}`);
|
|
|
|
const promise = loader();
|
|
promises.set(key, promise);
|
|
void promise.catch(() => {
|
|
if (promises.get(key) === promise) promises.delete(key);
|
|
});
|
|
return promise;
|
|
};
|
|
}
|