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

Dart中如何基于函数参数创建新Future实例并修复重试执行问题

问题原因

你当前的代码里,retry(getResponse(1))是先执行了getResponse(1),得到一个已创建的Future实例,然后把这个实例传给retry函数。而Future对象只能完成一次,所以不管重试多少次,都是在等同一个Future的结果,自然getResponse里的逻辑只会执行一次。

修复方案

核心是让retry接收一个返回Future的函数,而不是直接接收Future实例。这样每次重试时,调用这个函数就能生成新的Future,重新触发getResponse的执行。

修改后的完整代码

import "dart:math";

Future getResponse(int sec) async {
  return Future.delayed(Duration(seconds: sec), () {
    int rand = Random().nextInt(10);
    print(rand);
    if (rand < 5) {
      return "success";
    } else {
      throw "rejected";
    }
  });
}

// 修改参数类型为返回Future的函数
Future retry(Future Function() f, [int count = 0]) async {
  try {
    // 调用函数获取新的Future
    return await f();
  } catch (e) {
    if (count < 5) {
      print(e);
      // 递归时返回并等待下一次重试的结果
      return await retry(f, count + 1);
    }
    // 达到重试上限后抛出错误(也可根据需求返回默认值)
    throw "达到最大重试次数";
  }
}

void main() async => await retry(() => getResponse(1));

关键修改点

  • retry参数类型变更:把Future f改成Future Function() f,传入的是可执行函数,而非已完成的Future实例。
  • 生成新Future:在try块里用await f()代替await f,每次尝试都触发一次getResponse的完整执行逻辑。
  • 递归传递结果:递归调用retry时加上return await,确保重试的结果能正确向上传递,同时等待下一次重试完成。
  • 调用方式调整:用() => getResponse(1)把getResponse的调用包装成函数,避免提前执行。

现在运行代码,每次失败后都会重新生成随机数,直到成功或者用完5次重试机会。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:01:44