我有一点哲学(或者可能只是无知)的问题。
基本上问题是:我们或者不应该“完全被动”,“完全被动”是什么意思?
一个简单的例子,说明为什么我会想到这个问题。
想象一下,我们进行API调用,某些元素可能为null。例如:
Observable<Result<Profile>> loadUserProfile(@Nullable String userId)
注意:结果是操作的状态(LOADING,SUCCESS,ERROR)
现在,据我所知,我们可以通过两个选项来处理userId的可空性:(注意:我在这里使用伪代码)
选项1:有点不是“完全被动”?
Observable<Result<Profile>> loadUserProfile(@Nullable String userId) {
if (userId is null) {
return Result.error("Something really bad is happening");
} else {
return ProfileApi.loadUserProfile(userId)
.map(profile -> Result.success(profile);
}
}
选项2:使用可选值(https://medium.com/@joshfein/handling-null-in-rxjava-2-0-10abd72afa0b)接近用例
Observable<Result<Profile>> loadUserProfile(@Nullable String userId) {
return Observable.just(new Optional<>(userId))
.flatMap(ProfileApi.loadUserProfile(userId))
.map(profile -> Result.success(profile)
}
对于这两种情况,userId为null的结果是发送Result.error(“发生了非常糟糕的事情”)
您更喜欢哪种选择?或者您可能更喜欢选项3 [在此处插入选项] ?
对不起,如果这是一个愚蠢的问题。我觉得它是,但我们会看到:) 无论如何感谢阅读。
结论:到目前为止,从已经讨论的内容来看,似乎任何一种方法都被认为是反应方式,而这只是你认为它最适合你的编码风格的问题。
答案 0 :(得分:0)
您面临的问题是基于存在或可空性。所以,让我们假设一些事情:
所有不期望的都是错误,因此它应该抛出异常
基于这个前提,这成为一个容易回答的问题。以下是您的示例:
Observable<Result<Profile>> loadUserProfile(@Nullable String userId) {
if (userId is null) {
return Observable.error(new UserIdIsNullException())
} else {
return ProfileApi.loadUserProfile(userId)
.map(profile -> Result.success(profile);
}
}
这样您就可以充分利用Observable
的所有力量。您只需要在UI中捕获这些错误并呈现相应的状态