forked from mengyxu/noob-components
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
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); |
|
}
|
|
|