培根中的惰性评估是什么.js



我无法理解培根.js中的惰性评估是什么。

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

这是 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,即使我单击按钮,也不会记录任何内容。根据文档,第二个应该在控制台上输出"正在执行"消息。

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

请帮我了解出了什么问题?

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

仅当专门记录为订阅流的调用时,才会进行实际订阅。它们列在"事件流和属性中的常用方法"下:https://baconjs.github.io/api.html - 即 subscribe()onValue()onValues()onError()onEnd()。如果你不关心事件,你可以使用submittedItems.onEnd(function(){});它实际上永远不会被调用,因为你的流永远不会结束。

最新更新