【前端】封装带重试机制的request,传入一个promise,成功直接返回,失败进行重试

项目场景:

前端处理请求大模型API时,有一些模型服务器在海外或者使用量高的情况下会出现“服务器繁忙,请稍后重试”的情况,导致在客户使用过程中影响生成效果。


解决方案:

封装一个函数,接受一个promise,成功直接返回,失败可以重试,支持传入重试次数和重试的间隔时间

/**
 * 支持错误重试的请求函数
 * @param requestFactory 生成请求的工厂函数
 * @param maxRetries 最大重试次数
 * @param delay 重试之间的延迟(毫秒)
 * @returns 带有错误重试功能的 Promise
 */
const retryRequest = <T>(
  requestFactory: () => Promise<T>,
  maxRetries: number = 3,
  delay: number = 1000
): Promise<T> => {
  let retries = 0;

  const execute = async (): Promise<T> => {
    try {
      return await requestFactory();
    } catch (error) {
      if (retries < maxRetries) {
        retries++;
        console.log(`请求失败,正在进行第 ${retries} 次重试...`);
        await new Promise((resolve) => setTimeout(resolve, delay));
        return execute();
      } else {
        throw new Error(`请求失败,已达到最大重试次数 ${maxRetries}`);
      }
    }
  };

  return execute();
};

使用示例

// 模拟一个可能会失败的请求
const fetchData = (): Promise<string> => {
  return new Promise((resolve, reject) => {
    // 模拟随机失败
    const random = Math.random();
    if (random > 0.3) {
      reject(new Error('随机错误'));
    } else {
      resolve('成功获取数据');
    }
  });
};

// 使用封装的 retryRequest
const main = async (): Promise<void> => {
  try {
    const result = await retryRequest(fetchData, 3, 2000);
    console.log('最终结果:', result);
  } catch (error) {
    console.error('所有重试失败:', error.message);
  }
};

main();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值