只有在特定条件下才使用什么RxJava操作符来链接可观察对象



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

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

  1. 从Observable中获取布尔值
  2. A:如果为真,则完成,返回真。B:如果是false,发出一个请求(调用它为firstquest)并接收一个Observable。
  3. A:同样的,如果为真,则完成,返回真。B:如果是false,则重新请求(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(因为它有意义返回一个可观察对象),但是嵌套的操作链(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.just(status)代替Observable.empty

相关内容

  • 没有找到相关文章

最新更新