38 lines
837 B
TypeScript
Raw Permalink Normal View History

2024-11-05 10:14:41 +08:00
/**
*
* @author jaylen
* @param fn
* @param delay
* @param immediate
* @returns
*/
export const debounce = <T extends (...args: any[]) => any>(
fn: T,
delay: number,
immediate = false
) => {
let timer: ReturnType<typeof setTimeout> | null = null
let isInvoke = false
const _debounce = function (thisArg: any, ...args: Parameters<T>) {
if (timer) clearTimeout(timer)
if (immediate && !isInvoke) {
fn.apply(thisArg, args)
isInvoke = true
} else {
timer = setTimeout(() => {
fn.apply(thisArg, args)
isInvoke = false
}, delay)
}
}
// 取消防抖
_debounce.cancel = function () {
if (timer) clearTimeout(timer)
timer = null
isInvoke = false
}
return _debounce
}