這幾乎取決於你想要做的,但假設你想一個TruthyObservable
,其行爲非常像默認Observable.create(...)
什麼但僅通過連號:
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
,然後通過appendOperators()
法filter()
鏈一Subject
通過所有值。請注意,我用Subject
替換了原來的觀察者obs = this.appendOperators(obs)
。
在當我打電話例如結束。 obs.next(3);
我實際上將價值推向Subject
,過濾它們並將它們傳遞給原始的Observer
。
您希望在哪裏添加'.filter(x => x);'?如果您試圖始終將標準RxJS運算符附加到您的自定義運算符上,我會理解它。 – martin
@martin我希望在任何其他操作符之前,操作符將被添加到類實例化中。 – estus
運算符不是擴展了'Rx.Observable'的類。這是其原型上的一種方法。無論如何,我想你的意思是'this.filter(布爾)'? – 2016-12-28 19:36:53