/** * 基于 Promise 重试工具函数 * @param fn 重试包装函数 * @param retriesLeft 重试次数,默认3次 * @param interval 重试间隔时间, 默认间隔是1s * * @example * const test = () => new Promise((resolve, reject) => * Math.random() < 0.2 ? resolve("Success") : reject(new Error("Error"))); * * retry(test, 5, 100, true) // retry 5 times with exponential backoff (100ms, 200ms, 400ms, 800ms, 1.6s, err) * retry(test, 5, 10) // retry infinite times with 10 inbetween (10ms, 10ms, 10ms, ...) * * fn(arguments) 参数方式 * retry(() => fn(arg1, arg2)) */ export async function retry( fn: () => Promise, retriesLeft = 3, interval = 1000, exponential = false, ): Promise { try { return await fn(); } catch (error) { if (retriesLeft) { await new Promise(r => setTimeout(r, interval)); return retry(fn, retriesLeft - 1, exponential ? interval * 2 : interval, exponential); } throw new Error(`Max retries reached for function ${fn.name}`); } } export default retry;