Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 2x 1x 1x 1x 1x 1x 1x 3x 3x 3x 1x 1x 2x 2x 1x 1x 2x 2x 1x 1x | /**
* Prevents creating multiple promises for a single key.
*
* If an existing promise for a key is pending, that promise will be returned without
* creating a new one.
*
* If a promise throws an error, it will be discarded, and a new one created the next
* time a key is requested.
*
* For now it only supports primitive value keys, but we can extend it if necessary.
*/
export class PromiseCache<Key extends string | number | undefined, Result> {
constructor(private createPromiseFromKey: (key: Key) => Promise<Result>) {}
private promisesByKey = new Map<Key, Promise<Result>>()
get(key: Key): Promise<Result> {
if (!this.promisesByKey.has(key)) {
this.promisesByKey.set(
key,
// Make sure to attach .catch() _before_ adding it to the cache.
// Otherwise external logic would be able to attach a catch() that
// could make this one unreachable.
this.createPromiseFromKey(key).catch((error) => {
this.promisesByKey.delete(key)
throw error
})
)
}
return this.promisesByKey.get(key)!
}
has(key: Key): boolean {
return this.promisesByKey.has(key)
}
}
|