用 RxJS 编写 functions/operators

Compose functions/operators with RxJS

有什么方法可以在没有点符号的情况下使用 RxJS 组合函数。

用例:我的事件流可能由可配置函数处理,我想通过添加到数组来配置它们。

const result$ = source$.map(function1).map(function2).map(function3)

我想要 farray = [function1, function2, function3] 并按如下方式使用它:

const result$ = source$.compose(farray)

原因是它应该能够在执行期间(或在初始化期间)更改farray

我找到了 transducers-js 但不确定它是如何 mapfilter 以及其他与 Rx 对应物的游戏。

感谢任何提示。

您可以只对地图使用 Rambda.compose。

const functions = [x => x * 2, x => x + 1]

Rx.Observable
  .range(0, 10)
  .map(R.compose(...functions))
  .subscribe(console.log);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.all.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.21.0/ramda.min.js"></script>

或者您可以创建自己的运算符:

const functions = [x => x * 2, x => x + 1];

Rx.Observable.prototype.mapCompose = function (functions) {
  return this.map(R.compose(...functions));
};

Rx.Observable
  .range(0, 10)
  .mapCompose(functions)
  .subscribe(console.log);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.all.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.21.0/ramda.min.js"></script>

Ofc,Rambda compose 可以切换为任何其他 compose 实现。

编辑: 编写 Rx 运算符稍微复杂一些。很难想象它会是什么样子,更不用说实施它了。但是你总是可以组合(或应用)一些接受可观察和 return 可观察的函数。这是示例实现。

Rx.Observable.prototype.apply = function (functions) {
  functions = [].concat(functions);
  
  return functions.reduce(function (observable, func) {
    return func(observable);
  }, this);
};

var functions = [obs => obs.map(x => x*2), obs => obs.filter(x => x % 3 === 0)];

Rx.Observable
  .range(0, 15)
  .apply(functions)
  .subscribe(console.log);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.all.js"></script>