【问题标题】:RxJS 5 subclassing Observable - static methods return instances of the parent classRxJS 5 子类化 Observable - 静态方法返回父类的实例
【发布时间】:2015-12-30 15:00:05
【问题描述】:

我正在尝试通过子类化 Observable 并覆盖 lift 方法来继承 RxJS Observable 类,如here 所述。

这适用于我添加到原型中的任何运算符,但是每当我尝试实例化我的子类的新 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();    

【问题讨论】:

    标签: javascript node.js rxjs reactivex


    【解决方案1】:

    我认为你不能这样做。您可能需要做一些猴子补丁并执行类似的操作

    Observable.prototype.customOperator = /*blabla*/

    这样子类化 Observable 的所有东西都会有 customOperator。

    【讨论】:

    • 谢谢,我想我将不得不这样做。我希望有一个更清洁的解决方案。
    • 呵呵,我正在努力应对相反的情况。我正在尝试找到一种肮脏但更快的方法来解决此问题stackoverflow.com/q/34534616/314407
    【解决方案2】:

    我为此 here 打开了一个问题,结果发现目前没有干净的解决方案。

    一旦this PR 提供 let 操作符被合并,最干净的解决方案就是包装原始的 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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多