2016-07-24 17 views
2

ドット表記なしでRxJSで関数を作成する方法はありますか。RxJSを使用して関数/演算子を作成する

使用例:イベントのストリームは設定可能な関数で処理される可能性があり、配列に追加するだけで設定したいと考えています。次のように

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

私はfarray = [function1, function2, function3]を持って、それを使用したい:

const result$ = source$.compose(farray) 

理由は、実行中(またはinitの間)をfarrayを変更することができるはずです。

私はを見つけましたが、それはmapfilterとそれ以外のRxのプレイではどうなっているのでしょうか。

ありがとうございます。

答えて

1

ramda.composeをmapと一緒に使うことができます。

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。私は自分の作曲を書いていると思いますが、Ramdaを引っ張るのは少しオーバーヘッドかもしれません。 Rx演算子を構成する可能性はありますか? '.map(fn1)'、 '.do(fn2)'、 '.filter(fn3)'のように? – DavidC

+0

@DavidCええ、あなたは簡単にreduceで十分な構成を実装することができます。演算子を作成する場合は、実行するだけでなく、正しい構文を想像することさえ困難であるため、実行するのは難しいことです。しかし、オブザーバブルを受け取り、返す関数を簡単に作成することができます。私はちょうどそれを示す私の答えに別の例を加えました。 – sielakos

+0

素晴らしい@sielakos!ありがとう。私はそれからたくさん学ぶでしょう... – DavidC

関連する問題