"计算机科学只有两个难题:缓存失效和命名事物."
菲尔卡尔顿
是否存在使缓存无效的通用解决方案或方法; 要知道某个条目何时过时,所以您可以保证始终获得最新数据?
例如,考虑一个getData()从文件中获取数据的函数.它根据文件的最后修改时间对其进行缓存,每次调用时都会检查该文件.
然后添加第二个函数transformData()来转换数据,并在下次调用函数时缓存其结果.它不知道该文件 - 如何添加依赖关系,如果文件被更改,此缓存将变为无效?
您可以在getData()每次调用时transformData()调用它并将其与用于构建缓存的值进行比较,但这可能最终成本非常高.
目前,我正在使用带有Scala(和JavaFX)的EventBus/PubSub架构/模式来实现一个简单的笔记组织应用程序(有点像Evernote客户端,带有一些添加的思维导图功能),我不得不说我真的很喜欢EventBus观察者模式.
以下是一些EventBus库:
https://code.google.com/p/guava-libraries/wiki/EventBusExplained
http://eventbus.org(目前似乎已经失效)这是我在实施中使用的那个.
http://greenrobot.github.io/EventBus/
以下是EventBus库的比较:http://codeblock.engio.net/37/
EventBus与发布 - 订阅模式相关.
但是!
最近,我参加了Coursera的Reactive课程并开始怀疑使用RXJava而不是EventBus是否会在单线程应用程序中简化事件处理代码?
我想问一下关于使用这两种技术(某种eventbus库谁编程的人的经验和某种形式的反应扩展(RX)):是很容易解决的事件处理使用RX复杂性比与事件总线架构给出没有必要使用多个线程?
我问这个,因为我已经在听到无功讲座Coursera是RX(即没有"回调地狱")导致更清洁的代码比使用观察者模式,但是我没有找到VS EventBus架构之间的任何比较RXJava.所以很明显,EventBus和RXJava都比观察者模式更好,但 在代码清晰度和可维护性方面,它在单线程应用程序中更好?
如果我理解正确的话,RXJava的主要卖点是,如果存在阻塞操作(例如,等待来自服务器的响应),它可用于生成响应式应用程序.
但我根本不关心异步性,我所关心的只是在单线程应用程序中保持代码清洁,解开并易于推理.
在这种情况下,使用RXJava比使用EventBus更好吗?
我认为EventBus将是一个更简单,更清晰的解决方案,我认为没有任何理由可以将RXJava用于单线程应用程序,而采用简单的EventBus架构.
但我可能错了!
如果我错了,请纠正我,并解释为什么RXJava在单线程应用程序中没有执行阻塞操作的情况下比简单的EventBus更好.
event-handling reactive-programming system.reactive event-bus rx-java
与其他"FRP"库不同,Rx不会阻止毛刺:使用时间不匹配的数据调用回调.有办法解决这个问题吗?
作为一个例子,假设我们有一系列昂贵的计算从单个流派生(例如,而不是_.identity,下面,我们做一个排序,或ajax提取).我们做了明确的改变,以避免重新计算昂贵的东西.
sub = new Rx.Subject();
a = sub.distinctUntilChanged().share();
b = a.select(_.identity).distinctUntilChanged().share();
c = b.select(_.identity).distinctUntilChanged();
d = Rx.Observable.combineLatest(a, b, c, function () { return _.toArray(arguments); });
d.subscribe(console.log.bind(console));
sub.onNext('a');
sub.onNext('b');
第二个事件最终将导致一些错误的状态:我们得到三个事件,而不是一个,这浪费了一堆cpu并要求我们明确解决不匹配的数据.
这个特定的例子可以通过删除distinctUntilChanged来解决,如果输入没有改变,可以编写一些不稳定的scan()函数来传递前一个结果.然后你可以压缩结果,而不是使用combineLatest.它很笨拙但可行.
但是,如果在任何地方存在异步,例如ajax调用,则zip不起作用:ajax调用将同步(如果已缓存)或异步完成,因此您无法使用zip.
编辑
尝试使用更简单的示例来阐明所需的行为:
你有两个流,a和b.b取决于a.b是异步的,但是浏览器可以缓存它,因此它可以独立地更新,也可以同时更新.因此,浏览器中的特定事件可能会导致以下三种情况之一:更新; b更新; a和b都更新.期望的行为是在所有三种情况下仅调用一次回调(例如渲染方法).
zip不起作用,因为当a或b单独触发时,我们不会收到来自zip的回调.combineLatest不起作用,因为当a和b一起发射时,我们得到两个回调.
我最近看到了关于Elm反应式编程的这个有趣的演讲.
这让我想知道用于实现Mario游戏的语言结构(在所示的演示文稿中,以及下图中)是否可以映射到纯JavaFX或JavaFX与RxJava结合的类似高级语言结构?
换句话说,是否有可能在单独的JavaFX或JavaFX + RxJava中使用相同的概念抽象(即时间相关值)来表达在Elm中实现的Mario游戏?
因此,如果经验丰富的JavaFX程序员或经验丰富的JavaFX + RxJava + Functional程序员想要将Mario游戏从Elm移植到1)JavaFX或2)JavaFX + RxJava那么程序员可以通过使用类似的高来完成此任务在Elm中使用的级别抽象?
我为JavaFX考虑的抽象是绑定,对于JavaFX + RxJava是绑定+ Observables/Subjects/Subscription.

来自操作员的文档TakeUntil(强调我的):
TakeUntil 订阅并开始镜像源 Observable。它还监视您提供的第二个 Observable。如果第二个 Observable 发出一个项目或发送终止通知,则 TakeUntil 返回的 Observable 停止镜像源 Observable并终止。
如果这是真的,那么为什么会阻止?:
Observable.Never<Unit>()
    .TakeUntil(Observable.Empty<Unit>())
    .Wait();