JavaScript实现带重试机制的异步函数同步执行问题求助
修正后的带重试逻辑的异步函数实现
问题分析
你的代码存在几个关键问题导致无法正常工作:
- 调用重试函数时,传入的匿名异步函数未等待
createS3Folder完成,导致错误无法被外层捕获 - 重试函数内部使用了未定义的
check变量 - 函数定义语法错误(对象方法与全局函数写法混淆)
- 递归调用时的作用域问题(对象方法未用
this调用自身)
修正后的完整代码
// 调用重试函数,注意匿名函数内要await createS3Folder await this.performOperationWithRetry(async () => { await createS3Folder("xyz"); }, metrics.s3TrialFailure, 0); // S3文件夹创建函数 async function createS3Folder(key) { console.log(key); const path = key.toUpperCase(); await s3.putObject({ Key: path, Bucket: envs.bucketName }).promise(); // 去掉冗余的try-catch,外层重试函数会统一捕获错误 } // 作为对象方法的重试函数写法(如果是全局函数,改为`async function performOperationWithRetry(...)`) performOperationWithRetry: async function(func, metric, trialCount) { try { console.log("当前尝试次数:", trialCount + 1); await func(); } catch (err) { // 假设envs.maxRetryCount设置为3,即最多重试3次(总尝试4次) if (trialCount === envs.maxRetryCount) { trialCount = 0; throw err; // 达到最大重试次数,抛出错误 } else { trialCount++; metric.inc(1); // 对象方法需用this调用自身,确保作用域正确 await this.performOperationWithRetry(func, metric, trialCount); } } }
关键修正点说明
- 调用时添加await:传入的匿名异步函数必须等待
createS3Folder执行完成,否则错误不会被外层try-catch捕获 - 修复变量未定义问题:将
console.log("TRIAL ",check)中的check替换为trialCount,并调整为显示当前尝试次数(trialCount+1更直观) - 修正函数定义语法:根据函数作用域选择写法,对象方法保留
performOperationWithRetry: async function(...),全局函数改为标准函数声明 - 递归调用作用域:对象方法内部递归时必须用
this.performOperationWithRetry,避免找不到函数 - 简化createS3Folder:去掉内部冗余的try-catch,外层重试函数会统一处理错误捕获与重试
注意事项
- 确保
envs.maxRetryCount的值设置为3,这样函数会在第4次尝试(1次初始+3次重试)失败后抛出错误 - 调用
performOperationWithRetry时必须使用await,确保代码流等待所有重试完成后再继续执行
内容的提问来源于stack exchange,提问作者Sarthak
相关产品推荐
相关产品推荐

