【问题标题】:What RxJava operator to use to chain observables only under certain conditions什么 RxJava 运算符仅在特定条件下用于链接可观察对象
【发布时间】:2017-01-24 09:59:56
【问题描述】:

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

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

  1. 从 Observable 中获取布尔值
  2. 答:如果是真的,你就完成了,返回真。 B:如果为 false,则发出请求(称为 firstRequest)并接收 Observable。
  3. A:同样,如果是真的,你就完成了,返回真。 B:如果是假的,那么再发出一个请求(secondRequest)。
  4. 答:如果它返回真,那么你就完成了。如果为假,则启动 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 内)让我认为必须有一种更简单的方法来实现与某些操作符相同的结果。

提前致谢。

【问题讨论】:

    标签: android rx-java reactive-programming


    【解决方案1】:

    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)

    【讨论】:

    • 哇,不知道defaultIfEmpty,而且它实际上链接得很清楚。非常感谢!
    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多