import { sleep } from "./sleep" /** * 执行一个函数,如果这个函数抛出错误,会重试指定次数,如果最终还是错误会把最后的错误抛出 * @param func 执行的函数 * @param retry 重试次数 * @param options.gap 重试时的间隔时间 ms * @param options.onError 当每一次出错时触发的事件 */ export async function retry( func: () => Promise, retry = 3, options?: { gap?: number; onError?: (e: Error) => any } ) { let i = 0 let tryError!: Error while (i < retry) { try { let re = await func() return re } catch (e: any) { tryError = e if (options?.onError) options.onError(e) if (options?.gap) await sleep(options.gap) } finally { i++ } } throw tryError }