gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:45:56 24 4
gpt4 key购买 nike

关于响应式编程的大部分资源,例如“A Survey on Reactive Programming”(Bainomugisha 等人,2012 年),介绍了几个可以对不同的响应式(Reactive)解决方案进行分类的特征。其中之一是采用哪种评估模型,即响应式(Reactive)语言(或库)是基于推送还是基于拉取(或两者)。

示例:让我们看一下这段伪代码:var c = a + b; 在响应式(Reactive)环境中,c 应该总是 包含 ab 的总和。因此,如果 ab 发生变化,则必须重新计算 c 的值。在基于推送的解决方案中,ab 在它们的值发生变化时通知 c,因此 c' s 值可以立即重新计算。在基于拉的解决方案中,c 会在值 c 立即查找 ab 的当前值> 本身被要求。因此,所有重新计算都被延迟,直到请求 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;
});

根据 this section of the Bacon.js documentation ,诸如 combine 之类的组合器使用惰性评估,也就是说,它们“避免评估实际上不需要的值”。

  • 问题 1:什么时候“实际”需要值?
  • 问题 2:是否可以安全地假设——至少在上面的示例中——Bacon.js 采用基于拉取的方法?还是我把事情搞混了?

但是,在本节的末尾,Bacon.js 文档提到如果想要“[t]在原始事件发生时强制求值,[one] 可以使用 flatMap ”。真的,现在我很困惑:

  • 问题 3:分别地,每当我使用 flatMap 时,假设 Bacon.js 都采用基于推送的评估模型是否安全?还是我又把事情搞混了?
  • 问题 4:我无法使用 flatMap 而不是 combine 重现上面的示例。这是否意味着根据我尝试做的事情,Bacon.js 有时会采用基于拉动的更改传播,有时会采用基于推的传播?

谁能提供说明,我将不胜感激。 :P

最佳答案

  1. 当订阅者调用事件的 value() 方法时,值是“需要的”。例如,这发生在所有 .on Value 订阅者中。 mapcombine 等组合器在需要它们各自的值之前不会评估输入值。另一方面,flatMap(f) 需要求值,因为它使用提供的函数 f 使用该值生成新流。另外 scan 目前很急切。

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

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

  4. 当然,您不能使用 flatMap 重现您可以使用 combine 的相同功能。

关于javascript - Bacon.js 的评估模型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27159109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com