本文介绍了术语:什么是函数式反应式编程中的故障/RX?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在函数式反应式编程的上下文中,"故障"的定义是什么?
我知道在某些FRP框架中可能会出现"故障",而在其他框架中则不会。例如,RX并非没有毛刺,而ReactFX也不是没有毛刺[1]。
谁能给出一个非常简单的示例,演示在使用RX时如何以及何时会出现故障,并在同一示例中显示相应的ReactFX解决方案如何以及为什么没有故障。
感谢阅读。
推荐答案
定义
我(自己)最喜欢的定义:
Scala.Rx定义:
示例
考虑整数变量a
,b
。定义sum
和prod
,以便sum := a + b
,prod := a * b
。让我们将此示例重写为JavaFX:
IntegerProperty a = new SimpleIntegerProperty();
IntegerProperty b = new SimpleIntegerProperty();
NumberBinding sum = a.add(b);
NumberBinding prod = a.multiply(b);
现在让我们写一点一致性检查:
InvalidationListener consistencyCheck = obs -> {
assert sum.intValue() == a.get() + b.get();
assert prod.intValue() == a.get() * b.get();
};
sum.addListener(consistencyCheck);
prod.addListener(consistencyCheck);
a.set(1);
b.set(2);
此代码失败,最后一行出现断言错误,原因是:
b
已更新(为2)sum
已更新(至3)- `consistencyCheck`被触发,`a==1`,`b==2`,但`prod==0`,因为`prod`尚未更新
这是一个小故障—prod
暂时与a
和b
不一致。
使用ReactFX消除故障
首先请注意,ReactFX不是"无故障"的,但它为您提供了消除故障的工具。除非你有意识地使用它们,否则ReactFX并不比RX(例如rxJava)更无故障。
消除ReactFX中故障的技术依赖于事件传播是同步的这一事实。另一方面,RX中的事件传播始终是异步的,因此这些技术无法在RX系统中实现。在上面的示例中,我们希望将侦听器通知推迟到sum
和prod
都已更新。以下是如何使用ReactFX:实现这一点import org.reactfx.Guardian;
import org.reactfx.inhibeans.binding.Binding;
IntegerProperty a = new SimpleIntegerProperty();
IntegerProperty b = new SimpleIntegerProperty();
Binding<Number> sum = Binding.wrap(a.add(b)); // Binding imported from ReactFX
Binding<Number> prod = Binding.wrap(a.multiply(b)); // Binding imported from ReactFX
InvalidationListener consistencyCheck = obs -> {
assert sum.getValue().intValue() == a.get() + b.get();
assert prod.getValue().intValue() == a.get() * b.get();
};
sum.addListener(consistencyCheck);
prod.addListener(consistencyCheck);
// defer sum and prod listeners until the end of the block
Guardian.combine(sum, prod).guardWhile(() -> {
a.set(1);
b.set(2);
});
这篇关于术语:什么是函数式反应式编程中的故障/RX?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!