2016-12-28 6 views
4

Observable 클래스는 어떻게 내장 RxJS 연산자를 적용하여 확장 할 수 있습니까?연산자를 사용하여 RxJS Observable 클래스를 확장하십시오.

class TruthyObservable extends Observable { 
    constructor(subscriber) { 
    super(subscriber); 

    return this.filter(x => x); 
    } 
} 

class TruthyMappedObservable extends TruthyObservable { 
    constructor(subscriber) { 
    super(subscriber); 

    return this.map(x => `'${x}'`); 
    } 
} 

이이 생성자 반환하지 않고 수행 할 수 있습니다

나는 이런 일을하기를 원하십니까?

+0

'.filter (x => x);가 추가 될 것으로 예상되는 곳은 어디입니까? 사용자 정의 연산자에 표준 RxJS 연산자를 항상 추가하려는 경우 이해할 수 있습니다. – martin

+0

@martin 다른 연산자보다 먼저 클래스 인스턴스에 연산자가 추가 될 것으로 기대합니다. – estus

+0

연산자는'Rx.Observable'을 확장하는 클래스가 아닙니다. 프로토 타입에 대한 방법입니다. 어쨌든, 당신이'this.filter (Boolean)'을 의미했다고 생각합니다. –

답변

2

이 꽤 많이 당신이 할 만의 당신은 매우 기본 Observable.create(...)처럼 동작 TruthyObservable을하고 싶은 말은하자하려는 작업에 따라 달라집니다 하지만 짝수를 전달합니다

import { Observable, Observer, Subscriber, Subject, Subscription } from 'rxjs'; 
import 'rxjs/add/operator/filter'; 

class TruthyObservable<T> extends Observable<T> { 

    constructor(subscribe?: <R>(this: Observable<T>, subscriber: Subscriber<R>) => any) { 
     if (subscribe) { 
      let oldSubscribe = subscribe; 
      subscribe = (obs: Subscriber<any>) => { 
       obs = this.appendOperators(obs); 
       return oldSubscribe.call(this, obs); 
      }; 
     } 

     super(subscribe); 
    } 

    private appendOperators(obs: Subscriber<any>) { 
     let subject = new Subject(); 

     subject 
      .filter((val: number) => val % 2 == 0) 
      .subscribe(obs); 

     return new Subscriber(subject); 
    } 

} 

let o = new TruthyObservable<number>((obs: Observer<number>) => { 
    obs.next(3); 
    obs.next(6); 
    obs.next(7); 
    obs.next(8); 
}); 

o.subscribe(val => console.log(val)); 

이 인쇄 콘솔에 :

6 
8 
https://jsbin.com/recuto/3/edit?js,console

일반적으로 Observable 재정 실제로 내부적으로 있지만 우리의 경우에 우리는 우리 자신에 의해 값을 방출 할 수있는 콜백을 사용하려는 구독을 만드는 _subscribe() 방법을 상속 클래스 (이 관찰 가능한부터 방출하지 않는 :

라이브 데모를 참조하십시오 무엇이든). 메서드 _subscribe()_subscribe 속성에 의해 가려져 있기 때문에이 메서드를 오버플로하면 연산자를 추가 할 수 없습니다. 그래서 나는 다른 함수로 생성자에서 _subscribe을 감싸고 filter()으로 연결된 Subject을 통해 모든 값을 appendOperators() 메서드에 전달합니다. 원래 관찰자를 Subject으로 바 꾸었습니다 (obs = this.appendOperators(obs)).

끝 부분에서 예를 들어. obs.next(3); 실제로 필터를 적용한 Subject으로 값을 밀어 넣고 원래 Observer에 전달합니다.

1

나는 당신이 사용자 정의 연산자로 필요한 것을 얻을 수 있다고 생각 :

Observable.prototype.truthy = function truthy() { 
     return this.filter(x => x); 
    } 
+0

감사합니다. 이렇게 할 수 있습니다. 그러나 문제는 상속을 통해 어떻게 수행 될 수 있는지, 프로토 타입을 수정하지는 않을 것입니다. – estus

+0

@estus,'TruthyObservable'에 대한 유스 케이스/예제를 제공해 주시겠습니까? –

+0

저는 RxJS가 어떻게 적절히 확장 될 수 있는지 이해하는데 주로 관심이 있습니다. 특히 Observable입니다. Angular 2 서비스로 확장 된 Observable을 사용하려고했는데, Typescript의 클래스에서 더 잘 재생됩니다. – estus

관련 문제