当前位置:首页 > JavaScript

js retry 实现

2026-04-05 10:52:54JavaScript

实现 JavaScript 重试机制的方法

使用递归实现重试

递归方式适合处理异步操作,通过递归调用自身实现重试逻辑。示例代码:

function retryOperation(operation, maxRetries, delay) {
  return new Promise((resolve, reject) => {
    operation()
      .then(resolve)
      .catch(error => {
        if (maxRetries <= 0) {
          return reject(error);
        }
        setTimeout(() => {
          retryOperation(operation, maxRetries - 1, delay)
            .then(resolve)
            .catch(reject);
        }, delay);
      });
  });
}

使用循环实现重试

循环方式更直观,适合同步或异步操作。示例代码:

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

带指数退避的重试

指数退避算法能有效避免资源竞争。示例代码:

async function retryWithBackoff(operation, maxRetries, initialDelay) {
  let delay = initialDelay;
  let lastError;

  for (let i = 0; i < maxRetries; i++) {
    try {
      return await operation();
    } catch (error) {
      lastError = error;
      await new Promise(resolve => setTimeout(resolve, delay));
      delay *= 2; // 指数增加延迟时间
    }
  }
  throw lastError;
}

使用第三方库实现

现有库如async-retryp-retry提供成熟的重试机制。使用p-retry示例:

const pRetry = require('p-retry');

async function run() {
  return pRetry(async () => {
    const result = await fetch('https://example.com');
    return result;
  }, {
    retries: 5,
    minTimeout: 1000
  });
}

重试策略定制

可根据需求定制重试条件,例如只对特定错误重试:

function shouldRetry(error) {
  return error.code === 'ECONNRESET' || error.code === 'ETIMEDOUT';
}

async function retryWithCondition(operation, maxRetries) {
  let lastError;
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await operation();
    } catch (error) {
      if (!shouldRetry(error)) throw error;
      lastError = error;
    }
  }
  throw lastError;
}

取消重试机制

实现可取消的重试操作:

js retry 实现

function retryWithCancel(operation, maxRetries, delay) {
  let cancel;
  const promise = new Promise(async (resolve, reject) => {
    let cancelled = false;
    cancel = () => { cancelled = true; };

    let lastError;
    for (let i = 0; i < maxRetries; i++) {
      if (cancelled) return reject(new Error('Cancelled'));
      try {
        return resolve(await operation());
      } catch (error) {
        lastError = error;
        await new Promise(r => setTimeout(r, delay));
      }
    }
    reject(lastError);
  });
  return { promise, cancel };
}

这些方法覆盖了从基础到高级的重试场景,可根据具体需求选择合适的实现方式。

标签: jsretry
分享给朋友:

相关文章

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与响应式…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js实现搜索

js实现搜索

实现搜索功能的方法 在JavaScript中实现搜索功能可以通过多种方式完成,以下是几种常见的实现方法。 使用数组的filter方法 通过数组的filter方法可以筛选出符合条件的数据项。假设有一个…

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…

js 实现跳转

js 实现跳转

使用 window.location.href 进行跳转 通过修改 window.location.href 可以跳转到指定 URL,浏览器会加载新页面: window.location.hre…

js图片上传实现

js图片上传实现

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/…