2016-12-28 20 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

これはかなりあなたが行うが、あなたは非常に多くのデフォルトのように振る舞う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()と連結したSubjectappendOperators()メソッドに渡してすべての値を渡すのはこのためです。オリジナルのObserverをSubjectobs = this.appendOperators(obs)に置き換えました。

最後に、私は例えばと呼んでいます。 obs.next(3);実際に値をフィルタリングしてにプッシュし、元のObserverに渡しています。

1

私はあなたがカスタム演算子で必要なものを得ることができると思う:

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

ありがとう、それはこの方法で行うことができます。しかし、問題は継承を介してどのように行うことができるか、プロトタイプを変更するつもりはないということです。 – estus

+0

@estus、 'TruthyObservable'の/ forのユースケース/例を教えていただけますか? –

+0

私は主に、RxJSを適切に拡張する方法を理解することに興味を持っています。特にObservableです。私はAngular 2サービスとして拡張された 'Observable'を使いたいと思っていました。 – estus

関連する問題