import { debounce } from 'lodash' export interface DebounceOptions { /** 是否在延迟开始前调用 */ leading?: boolean, /** 是否在延迟开始后调用 */ trailing?: boolean, /** 延迟调用最大值 */ maxWait?: number, } export function debouncePromiseFn (timer = 200, options?: DebounceOptions) { let resolveFn: (value?: unknown) => void | undefined // eslint-disable-next-line @typescript-eslint/no-explicit-any let rejectFn: (reason?: any) => void | undefined const debounceFn = debounce(() => resolveFn?.(), timer, options) return () => { rejectFn?.() // reject掉上一次的请求 return new Promise((resolve, reject) => { resolveFn = resolve rejectFn = reject debounceFn() }) } } /** * 将方法包装为debounce方法 * @param func * @param timer * @param options loadsh debounce options */ export function wrapperDebouncePromiseFn> (func: (...args: U) => T, timer?: number, options?: DebounceOptions) { const wait = debouncePromiseFn(timer, options) return async (...args: U) => { await wait() return func(...args) } } /** * 将方法包装为debounce方法 * @param func * @param failFn debounce没有调用时处理函数 * @param timer * @param options loadsh debounce options */ export function wrapperDebouncePromiseFnAndFailFn> (func: (...args: U) => T, failFn: (prams?: Error) => Promise, timer?: number, options?: DebounceOptions) { const wait = debouncePromiseFn(timer, options) return async (...args: U) => { await wait() .catch(failFn) return func(...args) } }