You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:24:04