【问题标题】:How can I break out of a chain of RxJava calls?如何摆脱 RxJava 调用链?
【发布时间】:2015-12-04 04:05:07
【问题描述】:

我有以下一组 RxJava 运算符:

  currentUser = mApi.getUserById(userToken, userId, userId)
                    .onErrorReturn(throwable -> null)
                    .map(userSet -> userSet.getUsers().get(0))
                    .doOnNext(user -> {
                        user.setToken(userToken);
                    })
                    .toBlocking()
                    .first();

这里的问题是doOnNext() 调用和map() 调用可能在空输入上运行。我可以在每个调用中检查空输入,并采取相应的行动,但我喜欢要做的只是打破操作链并将null 值返回给currentUser .

如果我以某种方式重组我的 RxJava 操作,这可能吗?

【问题讨论】:

    标签: android rest rx-java


    【解决方案1】:

    只需将onErrorReturn 运算符移动到链的末尾,在toBlocking() 之前。然后在getUserById 捕获的异常将通过以下运算符的错误处理传播(因此mapdoOnNext 不会被执行),直到点击onErrorReturn 并返回null。

    例如,此代码打印null:

    Integer myInt = Observable.<Integer> error(new RuntimeException())
                .doOnNext(item -> System.out.println("doOnNextInvoked"))
                .onErrorReturn(throwable -> null)
                .toBlocking().first();
    
    System.out.println(myInt);
    

    虽然这个:

    Integer myInt = Observable.<Integer> error(new RuntimeException())
                .onErrorReturn(throwable -> null)
                .doOnNext(item -> System.out.println("doOnNextInvoked"))
                .toBlocking().first();
    
    System.out.println(myInt);
    

    打印

    doOnNextInvoked
    null
    

    所以我们看到doOnNext 在第二种情况下被调用,但不是第一种。

    【讨论】:

      猜你喜欢
      • 2019-08-28
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多