Bacon.js 中的惰性求值是什么?

What is lazy evaluation in Bacon.js?

我无法理解 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" />

这是使用 map

的代码的 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,即使我点击按钮也没有任何记录。根据文档,第二个应该在控制台上输出 "Executing" 消息。

如果我使用 onValue 附加订阅者,这两个代码都有效。

请帮我看看哪里出了问题?

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

也不会

只有当调用被特别记录为订阅流时,才会进行实际订阅。它们在此处 "Common methods in EventStreams and Properties" 下列出:https://baconjs.github.io/api.html - 即 subscribe()onValue()onValues()onError()onEnd()。如果您不关心事件,您可以只使用 submittedItems.onEnd(function(){}); ,因为您的流永远不会结束,所以实际上从未调用过。