我试图通过继承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();
答案 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))