2016-07-24 2 views
2

점 표기법없이 RxJS로 함수를 작성하는 방법이 있습니까?RxJS로 함수/연산자 작성

사용 사례 : 이벤트의 내 ​​스트림은 구성 가능한 기능으로 처리 될 수 있으며 배열에 추가하여 구성하려고합니다. 다음과 같이

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

나는 farray = [function1, function2, function3]이 그것을 사용하고 싶습니다 :

const result$ = source$.compose(farray) 

이유가 실행 중 (또는 초기화시)를 farray을 변경 할 수 있어야한다는 것입니다.

나는 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. 나는 Ramada를 당기는 것만으로 약간의 오버 헤드가 생길 수 있다고 생각합니다. Rx 운영자조차도 작성할 수 있습니까? '.map (fn1)','.do (fn2)','.filter (fn3)'처럼? – DavidC

+0

@DavidC 예, 당신은 쉽게 줄일 수있는 충분한 구성을 구현할 수 있습니다. 조작자를 작곡하는 경우에는 구현하는 것 말고도 올바른 구문을 상상하기가 어렵 기 때문에 할 일이별로 없습니다. 그러나 관측 가능 함수를 가져 와서 반환하는 함수를 쉽게 구성 할 수 있습니다. 나는 그 대답을 보여주는 또 하나의 예를 덧붙였다. – sielakos

+0

놀라운 @sielakos! 감사. 나는 그것에서 많은 것을 배울 것이다 ... – DavidC