38 lines
837 B
TypeScript
38 lines
837 B
TypeScript
/**
|
|
* 防抖函数
|
|
* @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
|
|
}
|