下面是一个简单的实现,其中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。这样能够确保请求不会无限制地进行下去,从而防止出现死循环等问题。