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

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在

大多数关于反应式编程的资源,例如“反应式编程的调查”(Bainomugisha et al.,2012),介绍了几种可以对不同反应式解决方案进行分类的特征。其中之一是采用哪种评估模型,即反应式语言(或库)是基于推式还是基于拉式(或两者兼而有之)

例子:让我们来看看这段伪代码:<代码> 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会给我渴望或懒惰的评估。这是真的吗?还是有一种渴望一切的方式,也有一种懒惰的方式?