29 lines
788 B
TypeScript
29 lines
788 B
TypeScript
export type ThrottledFunction<T extends (...args: any) => any> = (...args: Parameters<T>) => void;
|
|
|
|
export function throttle<T extends (...args: any) => any>(func: T, ms: number): ThrottledFunction<T> {
|
|
let isThrottled = false;
|
|
let savedArgs: Parameters<T> | null;
|
|
let savedThis: any;
|
|
|
|
function wrapper(this: any, ...args: Parameters<T>) {
|
|
if (isThrottled) {
|
|
savedArgs = args;
|
|
savedThis = this;
|
|
return;
|
|
}
|
|
|
|
func.apply(this, args);
|
|
|
|
isThrottled = true;
|
|
|
|
setTimeout(function () {
|
|
isThrottled = false;
|
|
if (savedArgs) {
|
|
wrapper.apply(savedThis, savedArgs);
|
|
savedArgs = savedThis = null;
|
|
}
|
|
}, ms);
|
|
}
|
|
|
|
return wrapper;
|
|
} |