当前位置:首页 > 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
分享给朋友:

相关文章

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const ch…

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('imag…