本文介绍了术语:什么是函数式反应式编程中的故障/RX?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在函数式反应式编程的上下文中,"故障"的定义是什么?

我知道在某些FRP框架中可能会出现"故障",而在其他框架中则不会。例如,RX并非没有毛刺,而ReactFX也不是没有毛刺[1]。

谁能给出一个非常简单的示例,演示在使用RX时如何以及何时会出现故障,并在同一示例中显示相应的ReactFX解决方案如何以及为什么没有故障。

感谢阅读。

推荐答案

定义

我(自己)最喜欢的定义:

Scala.Rx定义:

示例

考虑整数变量ab。定义sumprod,以便
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暂时与ab不一致。

使用ReactFX消除故障

首先请注意,ReactFX不是"无故障"的,但它为您提供了消除故障的工具。除非你有意识地使用它们,否则ReactFX并不比RX(例如rxJava)更无故障。

消除ReactFX中故障的技术依赖于事件传播是同步的这一事实。另一方面,RX中的事件传播始终是异步的,因此这些技术无法在RX系统中实现。

在上面的示例中,我们希望将侦听器通知推迟到sumprod都已更新。以下是如何使用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?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-09 11:07