0

ここで説明されているように、Observable をサブクラス化し、リフト メソッドをオーバーライドすることで、RxJS Observable クラスをサブクラス化しようとしています。

これは、プロトタイプに追加するすべての演算子で機能しますが、サブクラスの新しい Observable をインスタンス化しようとすると (たとえば、MyObservable.from([1, 2, 3]) を使用して)、親クラスの Observable が取得されます。

Observable.return / Observable.from / を使用して期待どおりに動作するように、Observable を正しくサブクラス化するにはどうすればよいですか? jsbin

class MyObservable extends Rx.Observable {
  lift(operator) {
    const observable = new MyObservable();
    observable.source = this;
    observable.operator = operator;
    return observable;
  }

  customOperator() {
    return this.map(arguments)
  }
}


// instantiating an observable with **MyObservable**.from
var observable = MyObservable.from([1, 2, 3]);
console.log('instance of Rx.Observable: ' + observable instanceof Rx.Observable);


// this works as map is defined on RxObservable
observable
  .map(value => console.log('standard ' + value)) 
  .subscribe();


// this doesn't work. customOperator is only defined on MyObservable
// and MyObservable.from([1, 2, 3]) returns an Rx.Observable instance
observable
  .customOperator(value => console.log('custom ' + value)) 
  .subscribe();    
4

2 に答える 2

0

私はこれについてここで問題を提起しましたが、現在、これに対する明確な解決策がないことがわかりました。

let 演算子を提供するこのPR がマージされると、最もクリーンな解決策は、元のオブザーバブルをラップすることです。

class MyObservable extends Observable {
  constructor(source) {
    this.source = source;
  }

  lift(operator) {
    const observable = new MyObservable(); //<-- important part here
    observable.source = this;
    observable.operator = operator;
    return observable;
  }
}


Observable.of(42)
  .let(o => new MyObservable(o))
于 2016-01-10T00:23:46.050 に答える