为了好玩和学习,我尝试使用函数反应式编程在我的应用程序中实现撤消系统。我有一个状态更改流,需要将其保存到撤消堆栈中。当用户单击撤消时,我从堆栈中获取一个值并相应地更新应用程序状态。
问题是此更新本身也会在状态更改流中生成一个事件。所以我想要的是从状态更改中派生另一个流,该流在撤消后立即忽略状态更改。
一个简单的图:
states ----S----S----S----
undos -------U-----------
save ----S---------S----
第一行是应用程序状态更改的流,第二行是用户触发的撤消事件,第三行是我想要实现和监听的流,而不是第一个流。
在 FRP 中表达这种意图的最佳方式是什么?
In RxJS:
var state = Rx.Observable.interval(2000)
.map(s => ({type:'s', value: s}))
.take(3);
var undo = Rx.Observable.interval(3000)
.map(u => ({type:'u', value: u}; }))
.take(1);
var save = state.merge(undo).scan((prev, curr) =>
if (prev.type === 'u') {
return {type: 'removed'};
} else {
return curr;
}
}).filter(x => x.type !== 'removed' && x.type !== 'u');
看到这个JSBin http://jsbin.com/honomihiqu/2/edit。诀窍是merge是一个垂直组合器(相对于流图垂直),并且scan是一个水平组合器。使用两者,首先合并,然后扫描,您可以构建更强大的组合器,例如解决您的问题的组合器。培根和开菲尔的解决方案类似。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)