基于vue3.0和element-plus的组件库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

21 lines
870 B

export type AsyncHandler<T> = {
resolve: (t: T | PromiseLike<T>) => void;
reject: (err: any) => void;
};
type ExtractResult<Args extends any[]> = Args extends [AsyncHandler<infer T>, ...any[]] ? T : never;
type ExtractArgs<Args extends any[]> = Args extends [AsyncHandler<any>, ...infer Rest] ? Rest : never;
export function useAsyncEmits<Emits extends Record<string, any[]>>(emits: (evt: any, ...args: any[]) => void) {
const emitsAsync = <Evt extends keyof Emits>(evt: Evt, ...args: ExtractArgs<Emits[Evt]>) =>
new Promise<ExtractResult<Emits[Evt]>>((resolve, reject) => {
emits(evt, { resolve, reject }, ...args);
});
return emitsAsync;
}
export function handleAsync<T, Args extends any[]>(handler: (...args: Args) => Promise<T>) {
return ({ resolve, reject }: AsyncHandler<T>, ...args: Args) => handler(...args).then(resolve, reject);
}