函数拦截器

35 阅读1分钟

函数拦截器

常用场景

  1. 事件请求先保证一些额外事件处理完成、例如上传数据的合法性校验
  2. 点击事件处理时,需要一些前提条件需要完成

代码如下

export const isObject = (val: unknown): val is Record<any, any> =>
  val !== null && typeof val === 'object';

export const isFunction = (val: unknown): val is Function =>
  typeof val === 'function';

export const isPromise = <T = any>(val: unknown): val is Promise<T> =>
  isObject(val) && isFunction(val.then) && isFunction(val.catch);

export type Interceptor = (
    ...args: any[]
) => Promise<any> | Boolean | undefined | void

export function callInterceptor(
    interceptor: Interceptor | undefined,
    {
        args = [],
        done,
        canceled,
        error
    }:{
        args?: unknown[],
        done: () => void,
        canceled?: () => void,
        error?: (error: Error) => void
    }
) {
    if (interceptor) {
        const  returnVal = interceptor.apply(null, args)
        if (isPromise(returnVal)) {
            returnVal.then(() => {
                if (canceled) {
                    canceled()
                }else {
                    done()
                }
            }).catch(error)
        }else if (returnVal) {
            done()
        }else if (canceled) {
            canceled()
        }
    }else {
        done()
    }
}

callInterceptor(
    () => true,
    {
        done: () => console.log('done'),
        canceled: () => console.log('canceled'),
        error: (error) => console.log('error', error)
    }
)