これはかなりあなたが行うが、あなたは非常に多くのデフォルトのように振る舞う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
通常のクラスは、実際に内部サブスクリプションになりますが、我々の場合には、我々は、この観測は発光しないので、我々は自分自身(で値を発することができるコールバックを使用したい_subscribe()
メソッドをオーバーライドObservable
継承しますそれ自体何でも)。メソッド_subscribe()
は_subscribe
プロパティによって影を付けています(存在する場合)ので、このメソッドをオーバーライドしただけでは演算子を追加できません。だから、私は_subscribe
を別の関数でコンストラクタにラップし、filter()
と連結したSubject
をappendOperators()
メソッドに渡してすべての値を渡すのはこのためです。オリジナルのObserverをSubject
のobs = this.appendOperators(obs)
に置き換えました。
最後に、私は例えばと呼んでいます。 obs.next(3);
実際に値をフィルタリングしてにプッシュし、元のObserver
に渡しています。
'.filter(x => x);がどこに追加されると思いますか?カスタム演算子に標準のRxJS演算子を常に追加しようとしていたら、それは分かります。 – martin
@martin私は、演算子が他の演算子の前に、クラスのインスタンス化に追加されることを期待します。 – estus
演算子は 'Rx.Observable'を拡張するクラスではありません。プロトタイプ上のメソッドです。とにかく、あなたは 'this.filter(Boolean)'を意味すると思いますか? –