可以重试的请求方法
方式1
-
定义名为
request
的异步函数,它接受两个参数:url
表示请求的 URL,maxCount
表示最大重试次数,默认为 5。 -
在函数体内,使用
fetch
方法发起异步请求,并使用catch
方法捕获请求失败的情况。如果请求失败且重试次数小于等于 0,则使用Promise.reject
方法返回一个被拒绝的 Promise,否则递归调用request
方法,并将maxCount
减 1。 -
在
request
方法的调用端,使用then
方法获取请求的 Promise 对象,并在 Promise 对象解析后,使用await
关键字将响应对象转换为 JSON 数据。 -
最后,使用
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
的函数,它接受四个参数:
-
url
:要请求的 URL。 -
options
:一个包含请求选项的对象,例如请求方法、请求头等。 -
retries
:一个整数,表示重试次数,默认为 3。 -
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 数据。
请注意,该方法只重试请求失败的情况。如果请求成功但返回的数据不符合预期,它将不会重试。如果需要重试这种情况,请根据需要自行修改代码。