什么 RxJava 运算符仅在某些条件下用于链接可观察对象 [英] What RxJava operator to use to chain observables only under certain conditions

查看:32
本文介绍了什么 RxJava 运算符仅在某些条件下用于链接可观察对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm developing a whole application in RxJava/Android, trying to make the things the most Rx-way possible.

我想我正在实现我想要的,但现在我遇到了一个问题,我确信存在更好的方法来做到这一点.它包括:

I think I'm achieving what I wanted, but now I've encountered an issue that I'm sure that exists a better way to do it. It consists of:

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

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

Right now I've implemented it in a very naive way (and sub-optimal):

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,但我认为这不是预期的用例),并订阅了 3 次我认为这是不对的.

I would like to know how to combine those operations in a way that made more sense (I peeked at combine, but I think it's not the intended use case for this), and subscribing three times it's not right, I think.

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

I thought about flatMapping (as it makes sense returning an Observable), but the nested chain of operations (flatMap inside flatMap inside flatMap) made me think that there has to be a simpler way of achieving the same result with some operators.

提前致谢.

推荐答案

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 替换为 Observable.just(status).

You can also replace Observable.empty with Observable.just(status).

这篇关于什么 RxJava 运算符仅在某些条件下用于链接可观察对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆