什么RxJava运算符仅用于在特定条件下链接可观察对象

时间:2016-09-16 08:31:10

标签: android rx-java reactive-programming

我正在使用RxJava / Android开发一个完整的应用程序,试图让这些东西成为最可能的Rx方式。

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

  1. 从Observable获取布尔值
  2. 答:如果这是真的,你就完成了,然后回归真实。 B:如果它是假的,请发出请求(称之为firstRequest)并收到一个Observable。
  3. 答:同样,如果是真的,你就完蛋了,回归真实。 B:如果它是假的,那么再发一个请求(secondRequest)。
  4. 答:如果它返回true,那么你又完成了。如果为false,则启动processFailed();
  5. 现在我以一种非常天真的方式实现它(并且次优):

    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)让我觉得必须有一种更简单的方法来实现与某些运算符相同的结果。

    提前致谢。

1 个答案:

答案 0 :(得分:7)

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)