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
}