当前位置:首页 > JavaScript

js实现retry

2026-03-13 16:56:05JavaScript

实现重试机制的几种方法

在JavaScript中实现重试机制可以通过多种方式完成,以下是几种常见的实现方法:

使用递归函数实现重试

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

使用async/await实现重试

js实现retry

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

使用第三方库实现重试

多个流行库提供了内置的重试功能:

js实现retry

  • axios-retry:为axios请求添加重试功能
  • p-retry:为Promise操作提供重试功能
  • async-retry:简单易用的异步重试库

指数退避策略实现

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

带条件判断的重试实现

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

每种实现方法适用于不同场景,选择哪种取决于具体需求。递归方法适合简单场景,async/await版本更易读,第三方库可以减少重复代码,指数退避适合网络请求,条件重试提供了更灵活的控制。

标签: jsretry
分享给朋友:

相关文章

js实现图片预览

js实现图片预览

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

js实现点击显示和隐藏

js实现点击显示和隐藏

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

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数:…