函数拦截器
常用场景
- 事件请求先保证一些额外事件处理完成、例如上传数据的合法性校验
- 点击事件处理时,需要一些前提条件需要完成
代码如下
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)
}
)