我有以下一组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操作,这可能吗?
答案 0 :(得分:2)
在onErrorReturn
之前,只需将toBlocking()
运算符移至链的末尾即可。然后,getUserById
处捕获的异常将通过以下运算符的错误处理传播(因此map
和doOnNext
不会被执行),直到达到{{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
在第二种情况下被调用,但不是第一种情况。