什么是Bacon.js的评估模型?

时间:2014-11-26 21:22:36

标签: javascript reactive-programming bacon.js

反应式编程的大多数资源,例如: "反应式编程调查" (Bainomugisha等人,2012)介绍了可以对不同反应性溶液进行分类的几个特征。其中之一是采用哪种评估模型,即反应性语言(或库)是基于推的还是基于拉式(或两者)。

示例:让我们来看看这段伪代码:var c = a + b;在被动环境中,c预计始终包含{的总和{1}}和a。因此,如果ba发生变化,则必须重新计算b的值。在基于推送的解决方案中,ca会在其值发生变化时通知b,以便可以立即重新计算c的值。在基于拉取的解决方案中,c只要求c本身的值ab,就会查找当前值。因此,所有重新计算都会被延迟,直到请求c的值。

很长一段时间以来,我一直试图找出JavaScript库Bacon.js正在使用的评估模型。让我们假设以下内容:

c

根据this section of the Bacon.js documentationvar a = Bacon.constant(21); // Creates a Property var b = Bacon.constant(21); var c = a.combine(b, function (x, y) { return x + y; }); 之类的组合使用惰性评估,即他们避免评估实际上不需要的值"。

  • 问题1:值是什么时候"实际上"需要的?
  • 问题2:假设 - 至少在上面的例子中 - Bacon.js采用基于拉的方法是否安全?或者我在这里混合了什么?

然而,在本节末尾,Bacon.js文档提到,如果有人想要在原始事件发生时强制评估,[1]可以使用combine &#34 ;.真的,现在我很困惑:

  • 问题3:每当我使用flatMap时,假设Bacon.js采用基于推送的评估模型是否安全?或者我在这里混合了什么 - 再次?
  • 问题4:我无法使用flatMap代替flatMap来重现上面的示例。这是否意味着取决于我想要做什么,Bacon.js有时采用基于拉动的变化传播,有时它会推出基于推送的传播?

对于能够提供澄清的人,我会非常感激。 :P

1 个答案:

答案 0 :(得分:4)

  1. 价值是"需要"当订阅者调用事件的value()方法时。例如,所有.on Value订阅者都会发生这种情况。像mapcombine这样的组合器在需要它们各自的值之前不会评估输入值。另一方面,flatMap(f)需要进行评估,因为它使用该值使用提供的函数f生成新流。此外scan目前也很渴望。

  2. 如上所述,在必要时进行评估的意义上,它是推拉的混合。事实上,Bacon.js并非基于任何研究论文,也不符合任何理论模型。

  3. 不,不要假设任何型号。相反,使用引用透明函数,让系统决定何时需要对它们进行评估。

  4. 当然,您无法使用flatMapcombine重现相同的功能。