이 꽤 많이 당신이 할 만의 당신은 매우 기본 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
에 전달합니다.
'.filter (x => x);가 추가 될 것으로 예상되는 곳은 어디입니까? 사용자 정의 연산자에 표준 RxJS 연산자를 항상 추가하려는 경우 이해할 수 있습니다. – martin
@martin 다른 연산자보다 먼저 클래스 인스턴스에 연산자가 추가 될 것으로 기대합니다. – estus
연산자는'Rx.Observable'을 확장하는 클래스가 아닙니다. 프로토 타입에 대한 방법입니다. 어쨌든, 당신이'this.filter (Boolean)'을 의미했다고 생각합니다. –