重试API

let timer;
let repeatTimes = 0;

async function P2UploadFile(fileName) {
  return new Promise((res) => setTimeout(() => res(fileName), 2000));
}

async function getP6upload2(params) {
  repeatTimes++;

  //暂且认为这是正确的道响应结果  要关闭继续调取定时器
  //我们给一个状态 这是一个通过的条件
  const condition = Math.random() > 0.6;
  console.log('condition', condition);
  if (condition) {
    resetRequest();
    return 'pass';
  } else {
    console.log('repeatTimes', repeatTimes);
    return 'forbidden';
  }
}

function resetRequest() {
  if (timer) {
    clearTimeout(timer);
    timer = null;
  }
  repeatTimes = 0;
}

function repeatQuest(fileName) {
  if (timer) {
    clearTimeout(timer);
    timer = null;
  }

  timer = setTimeout(async () => {
    try {
      const result = await getP6upload2(fileName);

      if (result !== 'pass' && repeatTimes < 6) {
        repeatQuest(fileName);
      } else {
        console.log('结束运行');
        resetRequest();
      }
    } catch (e) {
      console.log('e', e);
      if (repeatTimes < 6) {
        repeatQuest(fileName);
      } else {
        resetRequest();
      }
    }
  }, 2000);
}

// P2UploadFile('a.txt').then((fileName) => {
//   console.log(fileName);
//   repeatQuest(fileName);
// });

/**
 * 封装一个通用的接口重试函数
 * @param {Function} fn - 返回 Promise 的函数(例如 fetch 调用)
 * @param {number} retries - 最大重试次数
 * @param {number} delay - 每次重试间隔时间(毫秒)
 * @param {Function} shouldRetry - 可选:是否应该重试(默认只在抛出异常时重试)
 * @returns {Promise<any>}
 */
async function retryRequest(fn, retries = 3, delay = 1000, shouldRetry = null) {
  for (let attempt = 0; attempt <= retries; attempt++) {
    try {
      const result = await fn();
      if (shouldRetry && !shouldRetry(result)) {
        // 如果有 shouldRetry 并返回 false,认为不满足重试条件
        return result;
      }
      return result;
    } catch (err) {
      console.log('err', err);
      if (attempt === retries) {
        throw err;
      }
      await new Promise((resolve) => setTimeout(resolve, delay));
    }
  }
}

function testAPI() {
  return new Promise((res, rej) => {
    const random = Math.random();
    console.log('random', random);
    if (random > 0.8) {
      res('success');
    } else {
      rej('error');
    }
  });
}

retryRequest(testAPI, 6, 2000, (res) => {
  console.log('res', res);
  return res !== 'success';
});