2016-07-24 104 views
2

是否有任何方式如何使用RxJS编写函数而不使用点符号。使用RxJS编写函数/操作符

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

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

我想有farray = [function1, function2, function3]并使用它,如下所示:

const result$ = source$.compose(farray) 

的原因是,它应该能够在执行过程中改变farray(或init期间)。

我发现transducers-js但不知道它是如何mapfilter和其他玩Rx的对手。

感谢您的任何提示。

回答

1

您可以在地图上使用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构成能够切换任何其他撰写的实现。

编辑: 编写Rx操作符稍微复杂一点。很难想象它会如何,更不用说实施它了。但是你总是可以编写(或应用)一些可观察并返回可观察的函数。这里是示例实现。

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>

+0

感谢@sielakos。我想写我自己的作文,拉姆达只是为了这可能是一点点的开销。是否有可能组成Rx运营商?像.map(fn1)','.do(fn2)'和'.filter(fn3)'? – DavidC

+0

@DavidC是的,你可以很容易地执行足够的组成和减少。至于编写操作符,这将是一件相当困难的事情,因为甚至很难想象正确的语法,更不用说实现了。但是你可以很容易地编写接收和返回observable的函数。我在我的答案中又增加了一个例子来表明这一点。 – sielakos

+0

令人惊叹的@sielakos!谢谢。我会从中学到很多... – DavidC