System.reactive 反应式编程的底线在哪里
我已经在我的项目中使用RxJava大约一年了。 随着时间的推移,我变得非常喜欢它-现在我想可能太多了 我现在写的大多数方法都有某种形式的Rx,这太棒了!(直到它不是)。 我现在注意到,有些方法需要大量的工作来组合不同的可观测生成方法。 我有一种感觉,虽然我理解了我现在写的东西,但下一个程序员将很难理解我的代码 在我讲到底线之前,让我直接从Kotlin中的代码中给出一个示例(不要深入探讨):System.reactive 反应式编程的底线在哪里,system.reactive,rx-java,rx-android,System.reactive,Rx Java,Rx Android,我已经在我的项目中使用RxJava大约一年了。 随着时间的推移,我变得非常喜欢它-现在我想可能太多了 我现在写的大多数方法都有某种形式的Rx,这太棒了!(直到它不是)。 我现在注意到,有些方法需要大量的工作来组合不同的可观测生成方法。 我有一种感觉,虽然我理解了我现在写的东西,但下一个程序员将很难理解我的代码 在我讲到底线之前,让我直接从Kotlin中的代码中给出一个示例(不要深入探讨): private fun getCachedEntities( getManyFunc:()->可观察, g
private fun getCachedEntities(
getManyFunc:()->可观察,
getFromNetwork:()->可观察,
getFunc:(字符串)->可观察,
insertFunc:(T)->单位,
updateFunc:(T)->单位,
deleteFunc:(字符串)->单位)
=concat(
getManyFunc().filter{isNew(it.timestampMillis)}
.map{ListResult(it.value,“”)},
getFromNetwork().doOnNext{
与存储同步(it.entities、getFunc、insertFunc、updateFunc、deleteFunc)
}).first()
.onErrorResumeNext{e->//如果发生网络错误,请返回缓存的数据和错误
concat(getManyFunc().map{ListResult(it.value,“”)},错误(e))
}
简单地说,它的作用是:
- 从存储器中检索一些时间戳数据
- 如果数据不是新的,则从网络获取数据
- 再次将网络数据与存储器同步(以更新)
- 如果发生网络错误,请再次检索旧数据和错误
- 如果数据不是新的,则从网络获取数据
我发现在编写Rx(或任何稍微复杂的/新技术)时,有两件事我会牢记在心
如果您提供的代码是代码库的核心,并且处于复杂性的极端末端,那么它可能是好的。然而,如果你发现你所有的Rx代码都那么复杂,你可能会创建一个很难使用的代码库。当你拿起Rx时,它会变得非常闪亮,一切看起来都像生锈的钉子,只等着你插进去 就我个人而言,我认为最大的线索在于名称,反应式框架。给定一个需求,您需要考虑反应式解决方案是否真正有意义 在任何Rx方案中,您都希望引入一个或多个事件流,并针对事件执行一些操作 我认为有两个关键问题需要问:
- 您是否控制事件流
- 您必须以事件流的速率在多大程度上完成响应
- 新闻更新可随时提交到服务器,并以大容量创建
- 应按客户端设置的间隔刷新客户端
- 刷新间隔可以随时更改,用户始终可以请求立即刷新
- 客户端仅显示由用户指定的带有特定关键字标记的更新
- 新闻更新有时很长,客户端不应存储新闻更新的全部内容,而应显示
private fun <T : Entity> getCachedEntities( getManyFunc: () -> Observable<Timestamped<List<T>>>, getFromNetwork: () -> Observable<ListResult<T>>, getFunc: (String) -> Observable<Timestamped<T>>, insertFunc: (T) -> Unit, updateFunc: (T) -> Unit, deleteFunc: (String) -> Unit) = concat( getManyFunc().filter { isNew(it.timestampMillis) } .map { ListResult(it.value, "") }, getFromNetwork().doOnNext { syncWithStorage(it.entities, getFunc, insertFunc, updateFunc, deleteFunc) }).first() .onErrorResumeNext { e -> // If a network error occurred, return the cached data and the error concat(getManyFunc().map { ListResult(it.value, "") }, error(e)) }