可以使用Promise和async/await配合实现一个可指定超时时间的异步函数重试机制。
首先,定义一个retry函数,该函数包含一个异步函数fn和一个最大重试次数maxRetry以及一个超时时间timeout。retry函数先执行一次fn,如果执行成功则直接返回结果,如果执行失败则进行重试,直到重试次数达到maxRetry或者超时时间到达timeout。如果都没有成功,则抛出错误。
代码如下:
function retry(fn, maxRetry, timeout) {
return new Promise(async (resolve, reject) => {
let retryCount = 0;
let timer;
const run = async () => {
try {
const result = await fn();
resolve(result);
} catch (err) {
if (retryCount < maxRetry) {
retryCount++;
clearTimeout(timer);
timer = setTimeout(run, timeout);
} else {
reject(err);
}
}
};
timer = setTimeout(run, timeout);
});
}
使用时,只需要定义一个异步函数,然后调用retry函数即可。
示例:
async function fetchData() {
const result = await retry(fetchDataFn, 3, 1000);
console.log(result);
}
async function fetchDataFn() {
const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
if (!response.ok) {
throw new Error('Failed to fetch data');
}
return response.json();
}
fetchData();
上面的代码中,fetchData函数中调用了retry函数,重试的最大次数是3次,超时时间为1000ms。retry函数中执行了fetchDataFn异步函数,如果执行失败则进行重试,直到达到最大重试次数或者超时时间。如果执行成功,返回结果并打印到控制台。