fix: don't cache errors

This commit is contained in:
Zoltan Kochan
2018-04-15 19:17:01 +03:00
parent ed79c3ebd5
commit e403e2aa70

View File

@@ -1,21 +1,22 @@
import pLimit = require('p-limit')
interface CachedPromises<T> {
[name: string]: Promise<T>
}
export type MemoizedFunc<T> = (key: string, fn: () => Promise<T>) => Promise<T>
/**
* Save promises for later
*/
export default function memoize <T> (concurrency?: number): MemoizedFunc<T> {
const locks: CachedPromises<T> = {}
const limit = concurrency && pLimit(concurrency)
const locks = new Map<string, Promise<T>>()
const limit = concurrency && pLimit(concurrency) as (fn: () => Promise<T>) => Promise<T>
return (key: string, fn: () => Promise<T>): Promise<T> => {
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
})
}
}