65 lines
1.5 KiB
TypeScript
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);
|
|
}
|
|
};
|
|
}
|