mirror of
https://github.com/pnpm/pnpm.git
synced 2026-05-05 06:28:47 -04:00
fix: don't cache errors
This commit is contained in:
@@ -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
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user