当前位置:首页 > JavaScript

js retry 实现

2026-01-31 18:35:44JavaScript

实现 JavaScript 重试机制的方法

方法一:基于 Promise 和递归的简单重试

function retry(fn, maxRetries, delay) {
  return new Promise((resolve, reject) => {
    const attempt = (retryCount) => {
      fn()
        .then(resolve)
        .catch((error) => {
          if (retryCount >= maxRetries) {
            reject(error);
            return;
          }
          setTimeout(() => attempt(retryCount + 1), delay);
        });
    };
    attempt(0);
  });
}

方法二:支持指数退避的重试策略

js retry 实现

function retryWithBackoff(fn, maxRetries, initialDelay) {
  return new Promise((resolve, reject) => {
    const attempt = (retryCount) => {
      fn()
        .then(resolve)
        .catch((error) => {
          if (retryCount >= maxRetries) {
            reject(error);
            return;
          }
          const delay = initialDelay * Math.pow(2, retryCount);
          setTimeout(() => attempt(retryCount + 1), delay);
        });
    };
    attempt(0);
  });
}

方法三:支持自定义条件判断的重试

js retry 实现

function retryWithCondition(fn, maxRetries, shouldRetry) {
  return new Promise((resolve, reject) => {
    const attempt = (retryCount) => {
      fn()
        .then(resolve)
        .catch((error) => {
          if (retryCount >= maxRetries || !shouldRetry(error)) {
            reject(error);
            return;
          }
          setTimeout(() => attempt(retryCount + 1), 0);
        });
    };
    attempt(0);
  });
}

方法四:使用 async/await 语法实现

async function asyncRetry(fn, maxRetries, delay) {
  let lastError;
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await fn();
    } catch (error) {
      lastError = error;
      if (delay > 0) {
        await new Promise((r) => setTimeout(r, delay));
      }
    }
  }
  throw lastError;
}

方法五:封装为可配置的重试工具函数

function createRetry(options = {}) {
  const {
    maxRetries = 3,
    delay = 1000,
    backoffFactor = 1,
    shouldRetry = () => true
  } = options;

  return async function retry(fn) {
    let lastError;
    for (let i = 0; i < maxRetries; i++) {
      try {
        return await fn();
      } catch (error) {
        lastError = error;
        if (i === maxRetries - 1 || !shouldRetry(error)) {
          throw lastError;
        }
        const currentDelay = delay * Math.pow(backoffFactor, i);
        await new Promise((r) => setTimeout(r, currentDelay));
      }
    }
  };
}

使用示例

// 示例1: 基本使用
retry(() => fetch('https://api.example.com/data'), 3, 1000)
  .then(console.log)
  .catch(console.error);

// 示例2: 使用指数退避
retryWithBackoff(() => someAsyncOperation(), 5, 1000)
  .then(console.log)
  .catch(console.error);

// 示例3: 使用条件判断
retryWithCondition(
  () => axios.get('/api'),
  3,
  (error) => error.response?.status === 429
);

// 示例4: 使用配置化的重试函数
const customRetry = createRetry({
  maxRetries: 5,
  delay: 500,
  backoffFactor: 2,
  shouldRetry: (error) => error.code !== 'PERMANENT_ERROR'
});

customRetry(() => callExternalService())
  .then(console.log)
  .catch(console.error);

注意事项

  • 重试机制适用于暂时性错误(如网络波动),不适用于永久性错误
  • 对于幂等操作可以安全重试,非幂等操作需谨慎
  • 考虑设置合理的重试次数和延迟时间,避免无限重试
  • 在浏览器环境中使用时,注意用户可能离开页面导致重试中断

标签: jsretry
分享给朋友:

相关文章

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码…

js怎么实现异步

js怎么实现异步

异步实现方法 JavaScript中实现异步操作主要通过以下几种方式: Promise Promise是ES6引入的异步解决方案,用于处理异步操作的成功或失败状态。 const promise =…

js实现的游戏

js实现的游戏

JavaScript 游戏开发基础 JavaScript 是开发网页游戏的流行选择,因其无需插件即可在浏览器中运行。以下是一些关键技术和资源: HTML5 Canvas Canvas 提供了绘制图形…