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

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);
    }
  }
}

关键修正点说明

  1. 调用时添加await:传入的匿名异步函数必须等待createS3Folder执行完成,否则错误不会被外层try-catch捕获
  2. 修复变量未定义问题:将console.log("TRIAL ",check)中的check替换为trialCount,并调整为显示当前尝试次数(trialCount+1更直观)
  3. 修正函数定义语法:根据函数作用域选择写法,对象方法保留performOperationWithRetry: async function(...),全局函数改为标准函数声明
  4. 递归调用作用域:对象方法内部递归时必须用this.performOperationWithRetry,避免找不到函数
  5. 简化createS3Folder:去掉内部冗余的try-catch,外层重试函数会统一处理错误捕获与重试

注意事项

  • 确保envs.maxRetryCount的值设置为3,这样函数会在第4次尝试(1次初始+3次重试)失败后抛出错误
  • 调用performOperationWithRetry时必须使用await,确保代码流等待所有重试完成后再继续执行

内容的提问来源于stack exchange,提问作者Sarthak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:20:26