项目场景:
前端处理请求大模型API时,有一些模型服务器在海外或者使用量高的情况下会出现“服务器繁忙,请稍后重试”
的情况,导致在客户使用过程中影响生成效果。
解决方案:
封装一个函数,接受一个promise,成功直接返回,失败可以重试,支持传入重试次数和重试的间隔时间
/**
* 支持错误重试的请求函数
* @param requestFactory 生成请求的工厂函数
* @param maxRetries 最大重试次数
* @param delay 重试之间的延迟(毫秒)
* @returns 带有错误重试功能的 Promise
*/
const retryRequest = <T>(
requestFactory: () => Promise<T>,
maxRetries: number = 3,
delay: number = 1000
): Promise<T> => {
let retries = 0;
const execute = async (): Promise<T> => {
try {
return await requestFactory();
} catch (error) {
if (retries < maxRetries) {
retries++;
console.log(`请求失败,正在进行第 ${retries} 次重试...`);
await new Promise((resolve) => setTimeout(resolve, delay));
return execute();
} else {
throw new Error(`请求失败,已达到最大重试次数 ${maxRetries} 次`);
}
}
};
return execute();
};
使用示例
// 模拟一个可能会失败的请求
const fetchData = (): Promise<string> => {
return new Promise((resolve, reject) => {
// 模拟随机失败
const random = Math.random();
if (random > 0.3) {
reject(new Error('随机错误'));
} else {
resolve('成功获取数据');
}
});
};
// 使用封装的 retryRequest
const main = async (): Promise<void> => {
try {
const result = await retryRequest(fetchData, 3, 2000);
console.log('最终结果:', result);
} catch (error) {
console.error('所有重试失败:', error.message);
}
};
main();