重试API#
let timer;
let repeatTimes = 0;
async function P2UploadFile(fileName) {
return new Promise((res) => setTimeout(() => res(fileName), 2000));
}
async function getP6upload2(params) {
repeatTimes++;
//暂且认为这是正确的道响应结果 要关闭继续调取定时器
//我们给一个状态 这是一个通过的条件
const condition = Math.random() > 0.6;
console.log('condition', condition);
if (condition) {
resetRequest();
return 'pass';
} else {
console.log('repeatTimes', repeatTimes);
return 'forbidden';
}
}
function resetRequest() {
if (timer) {
clearTimeout(timer);
timer = null;
}
repeatTimes = 0;
}
function repeatQuest(fileName) {
if (timer) {
clearTimeout(timer);
timer = null;
}
timer = setTimeout(async () => {
try {
const result = await getP6upload2(fileName);
if (result !== 'pass' && repeatTimes < 6) {
repeatQuest(fileName);
} else {
console.log('结束运行');
resetRequest();
}
} catch (e) {
console.log('e', e);
if (repeatTimes < 6) {
repeatQuest(fileName);
} else {
resetRequest();
}
}
}, 2000);
}
// P2UploadFile('a.txt').then((fileName) => {
// console.log(fileName);
// repeatQuest(fileName);
// });
/**
* 封装一个通用的接口重试函数
* @param {Function} fn - 返回 Promise 的函数(例如 fetch 调用)
* @param {number} retries - 最大重试次数
* @param {number} delay - 每次重试间隔时间(毫秒)
* @param {Function} shouldRetry - 可选:是否应该重试(默认只在抛出异常时重试)
* @returns {Promise<any>}
*/
async function retryRequest(fn, retries = 3, delay = 1000, shouldRetry = null) {
for (let attempt = 0; attempt <= retries; attempt++) {
try {
const result = await fn();
if (shouldRetry && !shouldRetry(result)) {
// 如果有 shouldRetry 并返回 false,认为不满足重试条件
return result;
}
return result;
} catch (err) {
console.log('err', err);
if (attempt === retries) {
throw err;
}
await new Promise((resolve) => setTimeout(resolve, delay));
}
}
}
function testAPI() {
return new Promise((res, rej) => {
const random = Math.random();
console.log('random', random);
if (random > 0.8) {
res('success');
} else {
rej('error');
}
});
}
retryRequest(testAPI, 6, 2000, (res) => {
console.log('res', res);
return res !== 'success';
});