flutter - 如何在 RxDart 中重试流?
问题描述
我是 Dart 和 Flutter 的新手,我面临着一个障碍。
我正在用 Flutter 开发一个应用程序,它使用网络调用、令牌认证等。我使用 Dio 和 RxDart。问题是,默认情况下,我需要重试每个 api 调用 5 次,直到我从服务器获得正确的响应(例如,当我调用令牌服务器时,第一次调用响应 202,第二次或第三次调用响应 200)。如何重试呼叫?
这是我的 GET 方法:
Future _get(String url, {Map<String, dynamic> headers}) async {
var response = await dio.get(url, options:
new Options(headers: headers));
return response.data;
}
和一个返回 Future Observable 的方法:
Observable get2(String url, {Map<String, dynamic> headers}) {
return Observable.retry(_sourceStream(url, headers: headers) , 5);
}
Stream Function() _sourceStream(String url, {Map<String, dynamic> headers}) {
return () => Observable.fromFuture(_get(url, headers: headers));
}
我知道 RxDart 中有一个 retryWhen 工厂方法,但我无法以正确的方式使用我的方法。任何人都可以帮忙吗?
解决方案
使用Observable.retry:
Observable.retry(() => Observable.fromFuture(_get(url, headers: headers)), 5)
使用RetryWhenStream:
int retries = 0;
RetryWhenStream(
() => Observable.fromFuture(_get(url, headers: headers))),
(e, s) {
retries+=1;
// if there is more than 5 retries, throw an error
if (retries <= 5) return Observable.just('Lets retry again');
return Observable.error(e);
},
);
当有人开始收听这些流时,它将开始重试 5 次(如果有错误)
推荐阅读
- couchbase - 使用 Couchbase map/reduce 视图从所有文档中获取所有子项
- android - 在项目“projectName”中找不到路径为“sdk”的项目
- android - 如何在 XML Android Studio 中创建镜像矩形形状?
- python - 表达两个变量之间的复杂关系
- javascript - 如果用户未使用 Nodejs 登录,如何添加注销按钮
- google-cloud-platform - 从 Redis 到 Memorystore 的迁移挑战
- rust - std::ptr::write 是否传输它写入的字节的“未初始化”?
- javascript - Node.js 和 Typescript,如何动态访问导入的模块
- ios - 为 react-native ios 应用程序构建 ci/cd 管道:如何在 gitlab-ci 中运行 expo build?
- swift - 快速更改点击标签栏后刷新控制器冻结