mirror of https://github.com/nocodb/nocodb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.6 KiB
45 lines
1.6 KiB
import type { DebounceFilterOptions, MaybeRefOrGetter } from '@vueuse/core' |
|
|
|
type FunctionArgs = (...args: any[]) => any |
|
|
|
// Default function to generate a cache key |
|
function defaultGetCacheKey(): string { |
|
return 'default' |
|
} |
|
|
|
/** |
|
* Creates a cached debounced version of the given function. |
|
* |
|
* @param fn - The function to debounce. |
|
* @param ms - The debounce delay in milliseconds. Default is 500ms. |
|
* @param getCacheKey - Function to generate a unique cache key based on the arguments. |
|
* @param options - Additional options for debouncing. |
|
* |
|
* @returns A debounced version of the input function with caching. |
|
*/ |
|
export function useCachedDebouncedFunction<T extends FunctionArgs>( |
|
fn: T, |
|
ms: MaybeRefOrGetter<number> = 500, |
|
getCacheKey: (...args: Parameters<T>) => string | number = defaultGetCacheKey, |
|
options: DebounceFilterOptions = {}, |
|
): (...args: Parameters<T>) => ReturnType<T> { |
|
// Cache to store debounced functions based on a unique key |
|
const debounceCache = new Map<string | number, any>() |
|
|
|
return (...args: Parameters<T>): ReturnType<T> => { |
|
// Generate a unique key for the given arguments |
|
const key = getCacheKey(...args) |
|
|
|
// If the debounced function for the given key is not in the cache, create and cache it |
|
if (!debounceCache.has(key)) { |
|
const debouncedFn = useDebounceFn(fn, ms, options) |
|
debounceCache.set(key, debouncedFn) |
|
} |
|
|
|
// Retrieve the cached debounced function |
|
const debouncedFn = debounceCache.get(key) |
|
|
|
// Call and return the result of the debounced function |
|
return debouncedFn!(...args) |
|
} |
|
}
|
|
|