可以重试的请求方法

可以重试的请求方法

方式1

  1. 定义名为 request 的异步函数,它接受两个参数:url 表示请求的 URL,maxCount 表示最大重试次数,默认为 5。

  2. 在函数体内,使用 fetch 方法发起异步请求,并使用 catch 方法捕获请求失败的情况。如果请求失败且重试次数小于等于 0,则使用 Promise.reject 方法返回一个被拒绝的 Promise,否则递归调用 request 方法,并将 maxCount 减 1。

  3. request 方法的调用端,使用 then 方法获取请求的 Promise 对象,并在 Promise 对象解析后,使用 await 关键字将响应对象转换为 JSON 数据。

  4. 最后,使用 catch 方法捕获请求失败的情况,并输出错误信息。

在网络不稳定的情况下保证请求的成功率。当请求成功时,它将返回一个 Promise,该 Promise 将解析为响应的 JSON 数据。当请求失败时,它将重试指定次数,每次重试之间没有延迟。如果重试次数用尽,它将抛出一个错误。

/**
 *  发出请求,返回promise
 * @param {string} url 请求地址
 * @param {number} maxCount 最大重试次数
 */
async function request(url, maxCount = 5) {
  return await fetch(url).catch((error) =>
    maxCount <= 0 ? Promise.reject(error) : request(url, maxCount - 1)
  );
}

request("http://129.211.31.58:8080/api/board/loadBoard", 6)
  .then(async (pending) => {
    const result = await pending.json();
    console.log(result);
  })
  .catch((err) => {
    console.log("网络异常");
  });

方式2

async function retryableFetch(url, options = {}, retries = 3, delay = 1000) {
  try {
    const response = await fetch(url, options);
    if (!response.ok) {
      throw new Error(`Failed to fetch: ${response.status} ${response.statusText}`);
    }
    return response.json();
  } catch (error) {
    if (retries > 0) {
      await new Promise((resolve) => setTimeout(resolve, delay));
      return retryableFetch(url, options, retries - 1, delay);
    }
    throw error;
  }
}

上述代码定义了一个名为 retryableFetch 的函数,它接受四个参数:

  1. url:要请求的 URL。

  2. options:一个包含请求选项的对象,例如请求方法、请求头等。

  3. retries:一个整数,表示重试次数,默认为 3。

  4. delay:一个整数,表示重试之间的延迟时间(以毫秒为单位),默认为 1000。

当请求成功时,它将返回一个 Promise,该 Promise 将解析为响应的 JSON 数据。

当请求失败时,它将重试指定次数,每次重试之间延迟指定的时间。如果重试次数用尽,它将抛出一个错误。

以下是使用示例:

retryableFetch('https://jsonplaceholder.typicode.com/todos/1')
  .then((data) => console.log(data))
  .catch((error) => console.error(error));

在上面的示例中,我们使用 retryableFetch 方法请求了一个 JSON 数据的 URL。如果请求失败,它将重试三次,并在每次重试之间等待一秒钟。如果重试次数用尽,它将抛出一个错误。如果请求成功,它将打印响应的 JSON 数据。

请注意,该方法只重试请求失败的情况。如果请求成功但返回的数据不符合预期,它将不会重试。如果需要重试这种情况,请根据需要自行修改代码。

你可能感兴趣的:(前端,前端,javascript)