前端面试题 - 85. 实现maxRequest,成功后resolve结果,失败后重试,尝试超过一定次数才真正的reject

102 阅读1分钟

下面是一个简单的实现,其中maxRequest为最大尝试次数:

function request(url, maxRequest) {
  let retryTimes = 0; // 记录当前重试次数

  return new Promise((resolve, reject) => {
    const tryRequest = () => {
      fetch(url)
        .then(response => {
          if (response.ok) {
            resolve(response.json()); // 成功后resolve结果
          } else {
            retry(); // 失败后重试
          }
        })
        .catch(() => {
          retry(); // 失败后重试
        });
    };

    const retry = () => {
      if (retryTimes < maxRequest) {
        retryTimes++;
        tryRequest(); // 继续尝试请求
      } else {
        reject(new Error(`Exceeded max request times: ${maxRequest}`)); // 尝试超过一定次数才真正的reject
      }
    };

    tryRequest();
  });
}

在该实现中,我们使用了Promise对象来封装异步请求。在请求过程中,如果请求成功,就将结果作为参数调用resolve方法;如果请求失败,则进行重试,重试次数不超过maxRequest指定的最大尝试次数。如果重试次数达到最大值,才真正地reject Promise。这样能够确保请求不会无限制地进行下去,从而防止出现死循环等问题。