2016-07-24 107 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