RxJS 5子类化Observable - 静态方法返回父类的实例

时间:2015-12-30 15:00:05

标签: javascript node.js rxjs reactivex

我试图通过继承Observable并覆盖lift方法,按照here所描述的方式继承RxJS Observable类。

这适用于我添加到原型的任何运算符,但每当我尝试实例化我的子类的新Observable时(例如使用MyObservable.from([1,2,3]),我得到一个父类的Observable 。

如何正确地对Observable进行子类化,以便使用Observable.return / Observable.from /按预期工作? 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();    

2 个答案:

答案 0 :(得分:1)

我认为你做不到。您可能需要进行一些猴子修补并执行类似

的操作

Observable.prototype.customOperator = /*blabla*/

这样,Observable的所有子类都将包含customOperator。

答案 1 :(得分:0)

我为此here打开了一个问题,事实证明目前还没有解决方案。

提供let运算符的this PR合并后,最干净的解决方案是包装原始的observable:

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))