我怎样才能打破一系列RxJava调用?

时间:2015-12-03 17:26:35

标签: android rest rx-java

我有以下一组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操作,这可能吗?

1 个答案:

答案 0 :(得分:2)

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

例如,此代码打印onErrorReturn

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 在第二种情况下被调用,但不是第一种情况。