我有一个非常简单的任务来发送远程数据请求。但需要处理我的请求并获得本地远程错误。 像数学这样的功能方式有很多方法可以解决问题。
所以首先要简单地注意这样做:
val remote = remotePurchase
.getAvailableUsersMaxCount()
.subscribe({},{
//on failed
getLocal()
})
但我觉得它是rx初学者,也是回调糟糕的回调方式。
我也想这样做:
override fun getActualUsersMaxCount(): Observable<Int> {
return remotePurchase
.getAvailableUsersMaxCount()
.flatMap {
updateUsersCount(it)
}
.onErrorReturn {
userLocal.getById(PrefProvider.userId).map {
it.chatUsersCount?:0
}.blockingFirst()
}
}
有些时候会把握:
引起:rx.exceptions.CompositeException:发生了2个异常。
喜欢这个github.com/ReactiveX/RxJava/issues/3679
然后我知道使用toBlocking并不是最好的主意。请参阅post here。
过了一段时间后,我更好地决定了这个:
override fun getActualUsersMaxCount(): Observable<Int> {
val remote = remotePurchase
.getAvailableUsersMaxCount()
.flatMap {
updateUsersCount(it)
}.onErrorReturn { -1 }
return zip(remote, userLocal.getById(PrefProvider.userId).map {
it.chatUsersCount ?: 0
}, { remoteCount, localCount ->
if(remoteCount!= -1) remoteCount else localCount
})
}
所以现在我差点控制局面。如果我从网络收到错误,我可以检查并收到本地结果
但你认为哪种变化更好?可能还有更简化的决定吗?
答案 0 :(得分:1)
您可以使用onErrorResumeNext
来避免第二个解决方案中的blockingFirst
来电。在我看来,这使它成为更好的解决方案。你不是在确定两个例外。可以提供更多关于它们的背景,因为我没有看到这个问题。
override fun getActualUsersMaxCount(): Observable<Int> {
return remotePurchase
.getAvailableUsersMaxCount()
.flatMap {
updateUsersCount(it)
}
.onErrorResumeNext(
userLocal.getById(PrefProvider.userId).map {
it.chatUsersCount?:0
})
}