好的,这里提供一种可指定超时时间的异步函数重试机制的实现方式:
async function retryWithTimeout(asyncFn, maxRetries = 3, timeout = 1000) {
let retries = 0;
while (retries < maxRetries) {
try {
const result = await Promise.race([asyncFn(), timeoutPromise(timeout)]);
return result;
} catch (err) {
retries++;
if (retries === maxRetries) {
throw new Error(`Retry failed after ${maxRetries} attempts`);
}
}
}
}
function timeoutPromise(ms) {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error(`Timed out after ${ms}ms`));
}, ms);
});
}
这个函数接受三个参数:一个异步函数 asyncFn
,最大重试次数 maxRetries
和超时时间 timeout
(单位为毫秒)。它会在 asyncFn
执行失败时自动重试(最多重试 maxRetries
次),并且在每次重试之前会等待 timeout
毫秒。
调用这个函数可以像这样:
async function myAsyncFunction() {
// do something asynchronous here...
}
try {
const result = await retryWithTimeout(myAsyncFunction, 3, 5000);
console.log(result);
} catch (err) {
console.error(err);
}
这将会尝试最多执行 myAsyncFunction
三次,每次等待 5 秒钟,并且在所有尝试都失败后抛出一个错误。如果 myAsyncFunction
成功返回结果,那么结果将会被打印到控制台上。
你也可以省略 maxRetries
或 timeout
参数。默认情况下,maxRetries
为 3 次,timeout
为 1 秒。