可以通过使用 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
对象。