gpt4 book ai didi

flutter - 如果 Future 在 Flutter 中失败,是否可以在内部重试 http 请求?

转载 作者:行者123 更新时间:2023-12-04 12:32:11 25 4
gpt4 key购买 nike

我正在使用以下代码成功轮询 mysite 以获取 JSON 数据并返回该数据。如果请求失败,则它也成功返回错误消息 return Result.error(title:"No connection",msg:"Status code not 200", errorcode:0);.

我想要的是让应用在返回错误消息之前重试请求 3 次。

基本上让 future 调用自己进行一些迭代。

我确实尝试创建一个外部函数,该函数会从外部 catch 调用,然后会依次调用 getJSONfromTheSite 函数第二次然后第三次,但问题是您会从Future 这样应用程序就不会接受这种方法

还有其他方法吗?

          Future<Result> getJSONfromTheSite(String call) async {
debugPrint('Network Attempt by getJSONfromTheSite');
try {

final response = await http.get(Uri.parse('http://www.thesite.com/'));

if (response.statusCode == 200) {
return Result<AppData>.success(AppData.fromRawJson(response.body));
} else {
//return Result.error("Error","Status code not 200", 1);
return Result.error(title:"Error",msg:"Status code not 200", errorcode:1);
}
} catch (error) {
return Result.error(title:"No connection",msg:"Status code not 200", errorcode:0);
}
}

最佳答案

以下扩展方法将为 futures 获取工厂,创建它们并尝试它们直到达到重试限制:

extension Retry<T> on Future<T> Function() {
Future<T> withRetries(int count) async {
while(true) {
try {
final future = this();
return await future;
}
catch (e) {
if(count > 0) {
count--;
}
else {
rethrow;
}
}
}
}
}

假设您有一个相当简单的 dart 方法:

 Future<AppData> getJSONfromTheSite(String call) async {
final response = await http.get(Uri.parse('http://www.thesite.com/'));

if (response.statusCode == 200) {
return AppData.fromRawJson(response.body);
} else {
throw Exception('Error');
}
}

你现在可以这样调用它:

try {
final result = (() => getJSONfromTheSite('call data')).withRetries(3);
// succeeded at some point, "result" being the successful result
}
catch (e) {
// failed 3 times, the last error is in "e"
}

如果您没有成功或抛出异常的普通方法,则必须调整重试方法以了解何时出现错误。也许使用具有 Either 类型的功能更强大的包之一,这样您就可以确定返回值是否为错误。

关于flutter - 如果 Future 在 Flutter 中失败,是否可以在内部重试 http 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68203083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com