javascript – 基于另一个Observable的自定义过滤器的功能反应运算符

为了好玩和学习,我正在尝试使用功能性反应式编程在我的应用程序中实现撤消系统.我有一个状态更改流,需要保存到撤消堆栈中.当用户单击undo时,我从堆栈中获取一个值并相应地更新应用程序状态.

问题是此更新本身也会在状态更改流中生成一个事件.所以我想要的是从状态变化中导出另一个流,它在撤消后立即省略状态变化.

一个简单的图表:

states   ----S----S----S----
undos    -------U-----------     
save     ----S---------S----

第一行是应用程序状态更改流,第二行是用户触发的撤消事件,第三行是我想要实现和监听而不是第一个流的流.

在FRP中表达此类意图的最佳方式是什么?

解决方法:

在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.技巧是合并是一个垂直组合器(垂直于流图),扫描是一个水平组合器.使用两者,首先合并,然后扫描,您可以构建更强大的组合器,如解决您的问题的组合器. Bacon和Kefir的解决方案类似.

上一篇:javascript – 从流onError恢复的惯用方法


下一篇:javascript – rxjs / Subscription没有导出成员’Subscription’