我想使用 bacon.js 制作一个简单的网页。它应该有一个通过鼠标单击切换 bool 状态的按钮。
设置流后,应通过将对象发送到 init 流来初始化应用程序。在这里,我只是发送所需的切换初始 bool 状态 (false
)。
代码如下所示(我伪造了按钮点击和初始化):
// Helper function
var neg = function (a) { return !a; };
// Fake of initialization stream. End after one element
var init = Bacon.sequentially(500, [false]);
// Fake of button click event stream.
var click = Bacon.repeatedly(1000, [{}]);
var toggle = init.concat(click).scan(null,
function(a, b) { return a === null ? b : neg(a); }).skip(1).toEventStream();
toggle.log();
// Output: false, true, false, true, ....
上面的代码( jsFiddle )按预期工作,但我不喜欢 toggle
流创建行如此复杂。
是否可以省略种子值(从流中获取),并且 scan
返回 EventStream
而不是 Property
>,我可以写:
var toggle = init.concat(click).scan(neg);
这可以读得更好。或者,如果可以将种子作为流提供,我可以这样写:
var toggle = click.scan(init, neg);
您有什么建议可以使代码更清晰吗?
是否有使用 scan
的替代解决方案?
我应该创建一个自己的 scan
方法吗?
最佳答案
如果您阅读了我之前写的内容,请忽略。它。 :) 这种情况正是 flatMap 的用途:创建流的流。使用平面 map 。
// Helper function
var neg = function (a) { return !a; };
// Fake of initialization stream. End after one element
// Note the use of `later` instead of `sequentially`, by the way
var init = Bacon.later(500, false);
// Fake of button click event stream.
var click = Bacon.repeatedly(1000, [null]);
var toggle = init
.flatMap(function(initVal) { return click.scan(initVal, neg) });
toggle.log();
关于javascript - 如何让scan()的使用更加清晰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27342294/