javascript - 如何让scan()的使用更加清晰

标签 javascript reactive-programming frp bacon.js

我想使用 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/

相关文章:

javascript - jQuery: 'body' 元素两次激活滚动事件

javascript - 如何以正确的方式编写这段 JavaScript 代码?

swift - RxSwift 在可调试性方面的技术限制是什么?

haskell - Conal Elloit 的 FRP 中的 Reactive 的 Monad 和 Applicative 实例

javascript - 使用 Bacon.js 在延迟为 "pending"时禁用提交按钮

swift - 观察和分配属性

javascript - 页面刷新清除所有数据

javascript - 如何让浏览器提示用户保存服务器动态生成的文件?

java - 如何将 Flux 从 Mono 内部的列表中取出?

javascript - React 在提交处理程序中找不到 <input/> 值