我无法理解培根.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(){});
它实际上永远不会被调用,因为你的流永远不会结束。