Promise链执行getServiceCost报错时重试2次的实现方案
Promise调用链全链路重试实现方案
核心逻辑
要实现getServiceCost报错后重新执行完整的getUser、getServices、getServiceCost流程,仅需两步:
- 将完整的Promise调用链封装为可重复调用的独立函数
- 新增重试计数逻辑,捕获到指定错误时如果还没达到重试上限,就重新调用封装好的全链路函数
完整实现代码
为了方便测试,我们先修改getServiceCost函数添加随机报错逻辑:
function getUser(userId) { return new Promise((resolve, reject) => { console.log('Get the user from the database.'); setTimeout(() => { resolve({ userId: userId, username: 'admin' }); }, 1000); }) } function getServices(user) { return new Promise((resolve, reject) => { console.log(`Get the services of ${user.username} from the API.`); setTimeout(() => { resolve(['Email', 'VPN', 'CDN']); }, 3 * 1000); }); } function getServiceCost(services) { return new Promise((resolve, reject) => { console.log(`Calculate the service cost of ${services}.`); setTimeout(() => { // 模拟30%概率报错,方便测试重试逻辑 if (Math.random() > 0.7) { resolve(services.length * 100); } else { reject(new Error('计算服务费用失败')) } }, 2 * 1000); }); } // 最大重试次数:重试2次 const MAX_RETRY_TIMES = 2; // 封装完整的业务调用链 function runFullBusinessFlow() { return getUser(100) .then(getServices) .then(getServiceCost) } // 带重试逻辑的执行函数 function startRun(retryCount = 0) { return runFullBusinessFlow() .then(result => { console.log('执行成功,最终费用为:', result) return result }) .catch(error => { // 仅当是getServiceCost抛出的错误时触发重试,其他错误直接抛出 // 如果你需要所有环节报错都重试,去掉这个判断即可 if (error.message === '计算服务费用失败' && retryCount < MAX_RETRY_TIMES) { console.log(`第${retryCount + 1}次重试,重新执行全流程`) return startRun(retryCount + 1) } // 重试次数用完或者非目标错误,抛出最终错误 console.error(`重试${MAX_RETRY_TIMES}次后仍然失败,最终错误:`, error) throw error }) } // 启动执行 startRun()
逻辑说明
- 每次
getServiceCost报错后,都会重新执行完整的getUser→getServices→getServiceCost流程,不会复用之前的执行结果 - 初始执行1次+最多重试2次,总共最多会执行3次全流程
- 如果你需要任意环节报错都触发重试,只需要删掉catch语句里对错误信息的判断即可
内容的提问来源于stack exchange,提问作者art
相关产品推荐
相关产品推荐

