使用 fetch
实现接口重试功能,可以结合 Promise 的重试机制来实现。下面是一个使用 fetch
实现接口重试的示例:
function fetchWithRetry(url, options, maxRetry = 3, backoffDelay = 1000) {
return new Promise((resolve, reject) => {
let retryCount = 0;
const makeRequest = () => {
fetch(url, options)
.then((response) => {
if (response.ok) {
resolve(response);
} else {
throw new Error(`Request failed with status ${response.status}`);
}
})
.catch((error) => {
retryCount++;
if (retryCount < maxRetry) {
setTimeout(makeRequest, backoffDelay);
} else {
reject(error);
}
});
};
makeRequest();
});
}
// 使用示例
const url = 'https://api.example.com/api/data';
const options = {
method: 'GET',
};
fetchWithRetry(url, options)
.then((response) => {
console.log('请求成功', response);
})
.catch((error) => {
console.error('请求失败', error);
});
在上面的示例中,我们定义了一个 fetchWithRetry
函数,它接受 URL 和选项作为参数,并可选地接受最大重试次数和重试间隔。在函数内部,我们使用一个计数器 retryCount
来跟踪重试次数,并使用递归调用 setTimeout
来实现重试的延迟。
在 makeRequest
函数中,我们使用 fetch
发起请求,并在响应中处理成功和失败的情况。如果请求成功(状态码为 2xx),我们将解析的响应对象传递给 resolve
函数。如果请求失败,我们增加重试次数并判断是否达到最大重试次数。如果未达到最大重试次数,我们使用 setTimeout
设置延迟后再次调用 makeRequest
函数。如果达到最大重试次数,则将错误传递给 reject
函数。
你可以根据自己的需求调整最大重试次数和重试间隔。在示例中,我们设置了最大重试次数为 3 次,重试间隔为 1 秒。
当使用 Axios 发起网络请求时,你可以使用 Axios 的拦截器和 Promise 的重试机制来实现接口重试的功能。下面是一个使用 Axios 实现接口重试的示例:
const axios = require('axios');
// 创建 Axios 实例
const instance = axios.create({
baseURL: 'https://api.example.com',
timeout: 5000, // 请求超时时间
});
// 添加请求拦截器
instance.interceptors.request.use(
(config) => {
// 在请求发送之前可以进行一些处理,例如添加请求头等
return config;
},
(error) => {
return Promise.reject(error);
}
);
// 添加响应拦截器
instance.interceptors.response.use(
(response) => {
// 在响应返回之前可以进行一些处理,例如处理错误状态码等
return response;
},
(error) => {
// 在发生错误时进行重试
const config = error.config;
// 判断是否已经设置了重试次数上限
const maxRetry = config.maxRetry || 3;
// 判断是否已经达到重试次数上限
if (!config || !config.retryCount || config.retryCount >= maxRetry) {
return Promise.reject(error);
}
// 增加重试次数
config.retryCount = config.retryCount ? config.retryCount + 1 : 1;
// 创建新的 Promise 进行重试
const backoffDelay = config.backoffDelay || 1000; // 重试间隔,默认为 1 秒
return new Promise((resolve) => {
setTimeout(() => {
resolve(instance(config));
}, backoffDelay);
});
}
);
// 发起请求
instance.get('/api/data')
.then((response) => {
console.log('请求成功', response.data);
})
.catch((error) => {
console.error('请求失败', error);
});
在上面的示例中,我们创建了一个 Axios 实例 instance
,并添加了请求拦截器和响应拦截器。在响应拦截器中,我们处理了请求发生错误的情况,并进行了重试。重试的逻辑是判断是否已经达到重试次数上限,如果没有,则增加重试次数,并使用 setTimeout
设置延迟后再次发起请求。
在示例中,我们设置了最大重试次数为 3 次,重试间隔为 1 秒。这是一个简单的接口重试的实现示例,你可以根据自己的具体需求进行修改和扩展。