当前位置:首页 > JavaScript

js实现retry

2026-01-31 19:02:17JavaScript

JavaScript 实现重试机制

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

使用递归实现重试

递归方法可以在操作失败时自动重试,直到达到最大重试次数或操作成功。

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

使用 async/await 实现重试

async/await 语法使代码更易读,适合现代 JavaScript 开发。

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;
}

使用第三方库实现重试

现有库如 async-retryp-retry 提供了更完善的解决方案。

安装 p-retry

npm install p-retry

使用示例:

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

async function fetchData() {
  // 模拟可能失败的操作
  const response = await fetch('https://api.example.com/data');
  if (!response.ok) {
    throw new Error('Request failed');
  }
  return response.json();
}

async function main() {
  try {
    const data = await retry(fetchData, { retries: 3 });
    console.log(data);
  } catch (error) {
    console.error('All retries failed:', error);
  }
}

main();

指数退避策略

对于网络请求,采用指数退避策略可以更有效地处理暂时性故障。

async function retryWithBackoff(operation, maxRetries, initialDelay) {
  let retryCount = 0;
  let currentDelay = initialDelay;

  while (true) {
    try {
      return await operation();
    } catch (error) {
      if (retryCount >= maxRetries) {
        throw error;
      }
      retryCount++;
      await new Promise(resolve => setTimeout(resolve, currentDelay));
      currentDelay *= 2; // 指数增加延迟时间
    }
  }
}

带条件重试

有时需要根据特定错误条件决定是否重试。

js实现retry

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

以上方法可以根据具体需求选择或组合使用,实现灵活的重试机制。

标签: jsretry
分享给朋友:

相关文章

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js实现图

js实现图

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

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <…

js实现搜索

js实现搜索

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