反应式编程的大多数资源,例如: "反应式编程调查" (Bainomugisha等人,2012)介绍了可以对不同反应性溶液进行分类的几个特征。其中之一是采用哪种评估模型,即反应性语言(或库)是基于推的还是基于拉式(或两者)。
示例:让我们来看看这段伪代码:var c = a + b;
在被动环境中,c
预计始终包含{的总和{1}}和a
。因此,如果b
或a
发生变化,则必须重新计算b
的值。在基于推送的解决方案中,c
和a
会在其值发生变化时通知b
,以便可以立即重新计算c
的值。在基于拉取的解决方案中,c
只要求c
本身的值a
和b
,就会查找当前值。因此,所有重新计算都会被延迟,直到请求c
的值。
很长一段时间以来,我一直试图找出JavaScript库Bacon.js正在使用的评估模型。让我们假设以下内容:
c
根据this section of the Bacon.js documentation,var a = Bacon.constant(21); // Creates a Property
var b = Bacon.constant(21);
var c = a.combine(b, function (x, y) {
return x + y;
});
之类的组合使用惰性评估,即他们避免评估实际上不需要的值"。
然而,在本节末尾,Bacon.js文档提到,如果有人想要在原始事件发生时强制评估,[1]可以使用combine
&#34 ;.真的,现在我很困惑:
flatMap
时,假设Bacon.js采用基于推送的评估模型是否安全?或者我在这里混合了什么 - 再次?flatMap
代替flatMap
来重现上面的示例。这是否意味着取决于我想要做什么,Bacon.js有时采用基于拉动的变化传播,有时它会推出基于推送的传播?对于能够提供澄清的人,我会非常感激。 :P
答案 0 :(得分:4)
价值是"需要"当订阅者调用事件的value()
方法时。例如,所有.on Value
订阅者都会发生这种情况。像map
和combine
这样的组合器在需要它们各自的值之前不会评估输入值。另一方面,flatMap(f)
需要进行评估,因为它使用该值使用提供的函数f
生成新流。此外scan
目前也很渴望。
如上所述,在必要时进行评估的意义上,它是推拉的混合。事实上,Bacon.js并非基于任何研究论文,也不符合任何理论模型。
不,不要假设任何型号。相反,使用引用透明函数,让系统决定何时需要对它们进行评估。
当然,您无法使用flatMap
与combine
重现相同的功能。