31 lines
730 B
TypeScript
31 lines
730 B
TypeScript
export type Debouncer = ReturnType<typeof debouncer>;
|
|
|
|
export type DebouncerOptions = {
|
|
debounceTime: number;
|
|
};
|
|
|
|
export function debouncer<T>(callFn: (value: T) => unknown, { debounceTime = 60 }: Partial<DebouncerOptions> = {}) {
|
|
let currentValue: T | undefined;
|
|
let recentlyUpdated: boolean = false;
|
|
|
|
const debounceEmitValue = () => {
|
|
recentlyUpdated = false;
|
|
if (currentValue === undefined) return;
|
|
debounceUpdateValue(currentValue);
|
|
};
|
|
|
|
const debounceUpdateValue = (newValue: T) => {
|
|
if (recentlyUpdated) {
|
|
currentValue = newValue;
|
|
return;
|
|
}
|
|
|
|
callFn(newValue);
|
|
recentlyUpdated = true;
|
|
currentValue = undefined;
|
|
setTimeout(debounceEmitValue, debounceTime);
|
|
};
|
|
|
|
return { debounceUpdateValue };
|
|
}
|