RxJS 5 subclassing Observable - 静态方法 return 父实例 class
RxJS 5 subclassing Observable - static methods return instances of the parent class
我正在尝试通过 subclassing Observable 和重写 lift 方法来 subclass RxJS Observable class,如 here 所述。
这适用于我添加到原型中的任何运算符,但每当我尝试实例化我的子 class 的新 Observable 时(例如使用 MyObservable.from([1, 2, 3]) ,我得到了父对象的 Observable class。
如何正确地子 class 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();
我认为你不能那样做。你可能需要做一些猴子修补并做一些像
Observable.prototype.customOperator = /*blabla*/
这样所有子类化 Observable 都将拥有 customOperator。
我为此 here 提出了一个问题,结果发现目前没有解决方案。
一旦 this 提供 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))
我正在尝试通过 subclassing Observable 和重写 lift 方法来 subclass RxJS Observable class,如 here 所述。
这适用于我添加到原型中的任何运算符,但每当我尝试实例化我的子 class 的新 Observable 时(例如使用 MyObservable.from([1, 2, 3]) ,我得到了父对象的 Observable class。
如何正确地子 class 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();
我认为你不能那样做。你可能需要做一些猴子修补并做一些像
Observable.prototype.customOperator = /*blabla*/
这样所有子类化 Observable 都将拥有 customOperator。
我为此 here 提出了一个问题,结果发现目前没有解决方案。
一旦 this 提供 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))