Files
upage-git/app/utils/throttle.ts
2025-09-24 17:02:44 +08:00

65 lines
1.5 KiB
TypeScript

export function throttle<T extends (...args: any[]) => any>(func: T, wait: number): (...args: Parameters<T>) => void {
let timeout: NodeJS.Timeout | null = null;
let lastArgs: Parameters<T> | null = null;
let lastCallTime = 0;
return function executedFunction(...args: Parameters<T>) {
const now = Date.now();
const remaining = wait - (now - lastCallTime);
lastArgs = args;
if (remaining <= 0) {
lastCallTime = now;
func(...args);
lastArgs = null;
} else if (!timeout) {
timeout = setTimeout(() => {
lastCallTime = Date.now();
timeout = null;
if (lastArgs) {
func(...lastArgs);
lastArgs = null;
}
}, remaining);
}
};
}
export function throttleWithTrailing<T extends (...args: any[]) => any>(
func: T,
wait: number,
): (...args: Parameters<T>) => void {
let timeout: NodeJS.Timeout | null = null;
let lastArgs: Parameters<T> | null = null;
let lastCallTime = 0;
return function executedFunction(...args: Parameters<T>) {
const now = Date.now();
const remaining = wait - (now - lastCallTime);
lastArgs = args;
if (remaining <= 0) {
if (timeout) {
clearTimeout(timeout);
timeout = null;
}
lastCallTime = now;
func(...args);
} else if (!timeout) {
timeout = setTimeout(() => {
lastCallTime = Date.now();
timeout = null;
if (lastArgs) {
func(...lastArgs);
lastArgs = null;
}
}, remaining);
}
};
}