diff --git a/common/src/promise-utils.ts b/common/src/promise-utils.ts index 7a3c7336b..7125480f7 100644 --- a/common/src/promise-utils.ts +++ b/common/src/promise-utils.ts @@ -64,3 +64,27 @@ export function timeoutFunction(timeout: number, f: (isTimedOut: () => boolea }); }) } + +export function createPromiseDebouncer() { + let current: Promise; + + return (func: () => Promise): Promise => { + if (!current) + current = func().finally(() => current = undefined); + return current; + } +} + +export function createMapPromiseDebouncer() { + const map = new Map>(); + + return (key: any, func: () => Promise): Promise => { + const keyStr = JSON.stringify(key); + let value = map.get(keyStr); + if (!value) { + value = func().finally(() => map.delete(keyStr)); + map.set(keyStr, value); + } + return value; + } +}