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
相关产品推荐
相关产品推荐

