diff --git a/src/memoize.ts b/src/memoize.ts index 2964c7ad39..a191f876c7 100644 --- a/src/memoize.ts +++ b/src/memoize.ts @@ -1,21 +1,22 @@ import pLimit = require('p-limit') -interface CachedPromises { - [name: string]: Promise -} - export type MemoizedFunc = (key: string, fn: () => Promise) => Promise /** * Save promises for later */ export default function memoize (concurrency?: number): MemoizedFunc { - const locks: CachedPromises = {} - const limit = concurrency && pLimit(concurrency) + const locks = new Map>() + const limit = concurrency && pLimit(concurrency) as (fn: () => Promise) => Promise return (key: string, fn: () => Promise): Promise => { - if (locks[key]) return locks[key] - locks[key] = limit && limit(fn) || fn() - return locks[key] + let v = locks.get(key) + if (v) return v + v = limit && limit(fn) || fn() + locks.set(key, v) + return v.catch((err: Error) => { + locks.delete(key) + throw err + }) } }