可以通过使用 Promise
和 setTimeout
来实现一个可指定超时时间的异步函数重试机制。具体实现如下:
function retryPromise(promiseFactory, retryTimes, timeout) {
return new Promise((resolve, reject) => {
const tryUntilSucceedOrTimeout = () => {
promiseFactory()
.then((result) => {
resolve(result);
})
.catch((error) => {
if (retryTimes > 0) {
setTimeout(() => {
--retryTimes;
tryUntilSucceedOrTimeout();
}, timeout);
} else {
reject(error);
}
});
};
tryUntilSucceedOrTimeout();
});
}
该函数接受三个参数:
promiseFactory
是一个无参数函数,返回一个Promise
对象。retryTimes
是重试的次数。timeout
是超时时间,单位为毫秒。
该函数返回一个 Promise
对象,当异步操作完成时,该 Promise
对象将被解析或拒绝。
当异步操作发生错误时,该函数将重试异步操作,直到重试次数用尽或异步操作完成为止。每次重试将在超时时间之后进行。
以下是一个使用示例:
function asyncFunc() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const success = Math.random() < 0.8; // 模拟异步操作是否成功
if (success) {
resolve("Async operation completed.");
} else {
reject("Async operation failed.");
}
}, 1000);
});
}
retryPromise(asyncFunc, 3, 500)
.then((result) => {
console.log(result); // 打印 "Async operation completed." 或重试 3 次后拒绝 Promise 对象
})
.catch((error) => {
console.log(error); // 打印 "Async operation failed." 或重试 3 次后拒绝 Promise 对象
});
上面的示例中,asyncFunc
模拟一个异步操作,有 80% 的几率成功,20% 的几率失败。retryPromise
在异步操作失败时进行重试,最多重试 3 次,每次重试间隔为 500 毫秒。如果重试 3 次后还是失败,则拒绝返回的 Promise
对象。如果在重试过程中异步操作成功,则解析返回的 Promise
对象。