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(){});
,因为您的流永远不会结束,所以实际上从未调用过。
我无法理解 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
的代码的 JSvar 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(){});
,因为您的流永远不会结束,所以实际上从未调用过。