Javascript Bacon.js的评估模型是什么?
大多数关于反应式编程的资源,例如“反应式编程的调查”(Bainomugisha et al.,2012),介绍了几种可以对不同反应式解决方案进行分类的特征。其中之一是采用哪种评估模型,即反应式语言(或库)是基于推式还是基于拉式(或两者兼而有之)Javascript Bacon.js的评估模型是什么?,javascript,reactive-programming,bacon.js,Javascript,Reactive Programming,Bacon.js,大多数关于反应式编程的资源,例如“反应式编程的调查”(Bainomugisha et al.,2012),介绍了几种可以对不同反应式解决方案进行分类的特征。其中之一是采用哪种评估模型,即反应式语言(或库)是基于推式还是基于拉式(或两者兼而有之) 例子:让我们来看看这段伪代码: var c= a+b;在反应式环境中,c应始终包含a和b的总和。因此,如果a或b发生变化,则必须重新计算c的值。在基于推送的解决方案中,a和b在其值发生更改时通知c,以便可以立即重新计算c的值。在基于拉动的解决方案中,c在
例子:让我们来看看这段伪代码:<代码> var c= a+b;
在反应式环境中,c
应始终包含a
和b
的总和。因此,如果a
或b
发生变化,则必须重新计算c
的值。在基于推送的解决方案中,a
和b
在其值发生更改时通知c
,以便可以立即重新计算c
的值。在基于拉动的解决方案中,c
在需要值c
本身时立即查找a
和b
的当前值。因此,所有重新计算都会延迟,直到请求c
的值
相当长一段时间以来,我一直试图弄清楚JavaScript库Bacon.js使用的是什么评估模型。让我们假设如下:
var a = Bacon.constant(21); // Creates a Property
var b = Bacon.constant(21);
var c = a.combine(b, function (x, y) {
return x + y;
});
根据,像combine
这样的组合器使用惰性计算,也就是说,它们“避免计算实际不需要的值”
- 问题1:何时“实际”需要价值观
- 问题2:至少在上面的例子中,Bacon.js采用了基于拉的方法,这是安全的吗?还是我把事情搞混了
然而,在本节末尾,Bacon.js文档提到,如果想要“在原始事件发生时进行强制评估,[t]可以只使用flatMap
”。真的,现在我很困惑:
- 问题3:当我使用
flatMap
时,假设Bacon.js使用基于推送的评估模型是否安全?还是我又把事情搞混了
- 问题4:我无法使用
flatMap
而不是combine
从上面复制示例。这是否意味着,根据我的努力,Bacon.js有时采用基于拉的变化传播,有时采用基于推的变化传播
对于能够提供澄清的人,我将不胜感激P
当订户调用事件的Value()
方法时,值是“必需的”。例如,在所有.on Value
订阅者中都会发生这种情况。像map
和combine
这样的组合器在需要输入值之前不会计算输入值。另一方面,flatMap(f)
需要求值,因为它使用提供的函数f
使用该值生成新流。另外,scan
目前也很迫切
如上所述,在必要时进行评估的意义上,它是推和拉的混合。事实上,Bacon.js并非基于任何研究论文,也不符合任何理论模型
不,不要假设任何模型。相反,使用引用透明的函数,让系统决定何时需要对它们进行评估
当然,您不能用flatMap
复制与组合
相同的功能
我对bacon.js一无所知,但当我在vanilla中实现推拉模式时,您的代码似乎与拉方法相匹配:我认为您实际上是在寻找@Bergi部分,这与我的问题没有多大关系。然而,它也很有趣!非常感谢。我假设OP的意思是将c=combined(a,b,+)
与c=a.flatMap(a)->b.map(b)->a+b准确地再现出来。事实上,由于我无法用渴望运算符重现我的示例,我认为根据我的尝试,Bacon.js会给我渴望或懒惰的评估。这是真的吗?还是有一种渴望一切的方式,也有一种懒惰的方式?