仅在某些条件下使用什么 RxJava 运算符来链接可观察量

2024-01-30

我正在 RxJava/Android 中开发一个完整的应用程序,试图使事情尽可能成为 Rx 方式。

我认为我已经实现了我想要的目标,但现在我遇到了一个问题,我确信存在更好的方法来做到这一点。 它包括:

  1. 从 Observable 获取布尔值
  2. A:如果为 true,则完成,返回 true。 B:如果为 false,则发出请求(称为firstRequest)并接收一个 Observable。
  3. A:同样的,如果是true,就完成了,返回true。 B:如果为假,则发出另一个请求(secondRequest)。
  4. A:如果返回true,那么你就完成了。如果为 false,则启动 processFailed();

现在我已经以一种非常幼稚的方式实现了它(并且次优):

public void startProcess(){
  dataRepository.getStatus()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(status -> {
      if(status){
        processCompleted();
      } else {
        makeFirstRequest();
      }
    });
}

private void makeFirstRequest(){
  dataRepository.firstRequest()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(status -> {
      if(status){
        processCompleted();
      } else {
        makeSecondRequest();
      }
    });
}

private void makeSecondRequest(){
  dataRepository.firstRequest()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(status -> {
      if(status){
        processCompleted();
      } else {
        processFailed();
      }
    });
}

我想知道如何以更有意义的方式组合这些操作(我偷看了combine,但我认为这不是它的预期用例),而且订阅三遍是不对的,我认为。

我考虑过 flatMapping (因为返回一个 Observable 是有意义的),但是嵌套的操作链(flatMap 内的 flatMap 内的 flatMap)让我认为必须有一种更简单的方法来使用某些运算符实现相同的结果。

提前致谢。


flatMap救援:

  dataRepository.getStatus()
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .flatMap(status -> status ? Observable.empty() : dataRepository.firstRequest())
  .flatMap(status -> status ? Observable.empty() : dataRepository.secondRequest())
  .defaultIfEmpty(false)
  .subscribe(status -> {
    if(status){
      processCompleted();
    } else {
      processFailed();
    }
  });

您还可以更换Observable.empty with Observable.just(status).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅在某些条件下使用什么 RxJava 运算符来链接可观察量 的相关文章

随机推荐

  • Windows 批处理文件中等效的 Switch 语句

    我想知道是否有一种简单的方法可以根据一个表达式的值在 Windows 批处理文件中分支执行 类似于 C C C Java JavaScript PHP 和其他实际编程语言中的 switch case 块 我唯一的解决方法是一个简单的 if
  • SDK/ADT 更新后 Android 库依赖关系被破坏

    今天 我将 Android SDK 和 Eciple ADT 更新到最新版本 ADT Rev 22 重新启动 Eclipse 后 每当我引用自定义库时 它都会对构建路径感到非常不满意 An example is shown in this
  • Javascript 映射二维数组

    我有这个数组 rows 89 18 9 1903 3 4 3 1 800 它应该看起来像这样 89 1903 3 18 3 1 9 4 800 正在运行的代码如下所示 rows 0 map columnIndex gt rows map r
  • Spring Elastic Search 自定义字段名称

    我是 Elastic Search 的新手 我正在尝试使用 Spring data elasticsearch 来实现它 我的弹性搜索文档中有一些名称为 Transportation Telephone Number 的字段 当我尝试将我的
  • 用于通配符 url 映射的 Kubernetes Ingress 控制器

    我需要我的每个用户都可以通过自定义网址访问服务 例如 abccompany mycloudapp com 每个服务都是 kubernetes 服务 我正在查看入口控制器 但我需要一种使用通配符主机字段并以某种方式将值读入 path 和 se
  • #someDiv 是什么意思? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 当用户将鼠
  • Google Datastore 模拟器从本地数据库中删除数据

    我的本地计算机 Mac OSX 10 11 6 上运行着一个本地数据存储模拟器实例 我已经有一堆数据了 但我想从本地数据库中删除所有数据 从头开始 不过 我已经尝试删除存储数据的目录 我认为的目录 启动模拟器时会出现此消息 WARNING
  • VS2015中sprintf()和wsprintf()的格式差异

    我正在将一些代码从多字节移动到 unicode 并发现我的字符串格式出现错误 看起来 Visual Studio 2015 在 sprintf 和 wsprintf 之间处理宽度参数说明符 的方式不同 这是编译器错误或副作用 还是我错过了一
  • Angular 9 PWA 哈希不匹配(cacheBustedFetchFromNetwork)

    我有一个 Angular PWA 它无法离线启动 http 错误 504 当我检查 ngsw state 时 出现此错误 Error Hash mismatch cacheBustedFetchFromNetwork https examp
  • codeigniter 分页 - 每个页面上的结果保持相同

    我正在使用 Codeigniter 分页 但遇到了问题 url 在点击时发生变化 如限制更新 例如displayAllUsers 10 到 displayAllUsers 15 但结果保持不变 这是我的控制器 public function
  • C# XAMARIN.FORMS 中的超链接按钮

    我想创建具有点击可能性的标签 就像在 WIN 手机 xaml 中一样
  • 获取 openX 的域详细信息以及 Portrait_id 和 Landscape_id

    我刚刚下载了 OpenX android sdk 并尝试将其指向本地创建的域 但看起来它对我来说效果不佳 布局中的 OXMAdBanner 看起来像
  • 如何从事件处理程序获取 jquery 选择器

    我在页面上有几个输入元素 其中一个 第一个 是我可以输入任何其他元素的特定 ID 的地方 我希望我的代码以这样的方式设置 当我关注任何其他元素并且其 id 与第一个元素中输入的文本匹配时 它会突出显示 并在其中显示指示我选择了正确元素的文本
  • “更改表重命名”和“重命名表”有什么区别?

    我正在使用MySQL 举个例子 我想将表A重命名为B 那么下面的语句有什么区别 alter table A rename to B 和这个 rename table A to B 谁能详细比较一下它们之间的情况吗 是否会根据不同的发动机而有
  • 封装 Action 和 Func

    我正在尝试为某种 IExecutable 接口进行设计 我不会详细介绍 但重点是我有几个需要从基类执行的操作 它们可能采用不同的参数 没什么大不了的 并且它们可能 可能不返回值 到目前为止 这是我的设计 public abstract cl
  • 在 AngularJS 服务调用后填充 jQuery UI 手风琴

    我目前正在尝试构建一个 AngularJS 应用程序 其中使用 jQuery UI 手风琴控件 问题是 jQuery UI 手风琴已启动before我的 AngularJS 服务已完成从服务器加载数据 换句话说 手风琴在启动时没有任何数据
  • 如何在 WPF KeyBinding 中传递来自 DataGrid 的单元格信息?

    我有一个 DataGrid 来列出 MobileInfo 集合 DataGrid 配置为SelectionUnit FullRow 如果我单击任何行 那么它会选择整行 此外它还指向鼠标被击中的带有边框的单元格 边框选择在键盘导航时移动例如
  • 我如何知道库是服务器端、客户端还是两者?

    dart html 是一个客户端库 而 dart io 是一个服务器端库 因为这是显而易见的 但是一个时髦的库怎么样 http pub dartlang org packages http pub dartlang org packages
  • 为什么带有 T: 类约束的泛型方法会导致装箱? [复制]

    这个问题在这里已经有答案了 为什么将 T 限制为类的通用方法会在生成 MSIL 代码中包含装箱指令 我对此感到非常惊讶 因为肯定由于 T 被限制为引用类型 所以生成的代码不需要执行任何装箱 这是 C 代码 protected void Se
  • 仅在某些条件下使用什么 RxJava 运算符来链接可观察量

    我正在 RxJava Android 中开发一个完整的应用程序 试图使事情尽可能成为 Rx 方式 我认为我已经实现了我想要的目标 但现在我遇到了一个问题 我确信存在更好的方法来做到这一点 它包括 从 Observable 获取布尔值 A 如