好的,这里提供一种可指定超时时间的异步函数重试机制的实现方式:
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 秒。