用 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 但不确定它是如何 map
和 filter
以及其他与 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>
有什么方法可以在没有点符号的情况下使用 RxJS 组合函数。
用例:我的事件流可能由可配置函数处理,我想通过添加到数组来配置它们。
const result$ = source$.map(function1).map(function2).map(function3)
我想要 farray = [function1, function2, function3]
并按如下方式使用它:
const result$ = source$.compose(farray)
原因是它应该能够在执行期间(或在初始化期间)更改farray
。
我找到了 transducers-js 但不确定它是如何 map
和 filter
以及其他与 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>