【问题标题】:What is lazy evaluation in Bacon.js?Bacon.js 中的惰性求值是什么?
【发布时间】:2016-01-31 17:16:31
【问题描述】:

我无法理解 Bacon.js 中的惰性求值是什么。

我使用 map 和 flatMap 编写了 Bacon 提供的示例,得到了相同的结果。

这里是 HTML

<input id="itemname" type="text" />
<input id="additem" type="button" value="Add Item" />
<input id="purchase" type="button" value="Purchase" />

这是使用地图的代码的JS

var items = $("#additem").asEventStream("click").map(function(e){
    console.log("Executing");
    return document.getElementById("itemname").value;
}).toProperty();

var submittedItems = items.sampledBy($("#purchase").asEventStream("click"));

这里是使用 flatMap 的代码的 JS

var items = $("#additem").asEventStream("click").flatMap(function(e){
    console.log("Executing");
    return document.getElementById("itemname").value;
}).toProperty();

var submittedItems = items.sampledBy($("#purchase").asEventStream("click"));

对于这两个 JS 版本,即使我单击按钮也没有记录任何内容。根据文档,第二个应该在控制台上输出“正在执行”消息。

如果我使用 onValue 附加订阅者,这两个代码都可以工作。

请帮助我了解问题所在?

【问题讨论】:

    标签: javascript rxjs frp bacon.js


    【解决方案1】:

    当您创建基于另一个流的流时,例如通过调用stream.sampledBy(...),它订阅原始stream。无论您将多少个 create-stream-from-stream 函数链接在一起。所以$("#additem").asEventStream("click") 不会引起订阅,.map(...).toProperty(); 也不会。

    只有在专门记录为订阅流的调用时才会进行实际订阅。它们在此处的“EventStreams 和属性中的常用方法”下列出:https://baconjs.github.io/api.html - 即 subscribe()onValue()onValues()onError()onEnd()。如果您不关心这些事件,您可以使用 submittedItems.onEnd(function(){});,因为您的流永远不会结束,所以它实际上从未被调用过。

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      • 1970-01-01
      • 2020-07-10
      • 2011-02-23
      • 2013-12-30
      • 2020-05-19
      相关资源
      最近更新 更多