这几乎取决于你想要做的,但假设你想一个TruthyObservable
,其行为非常像默认Observable.create(...)
什么但仅通过连号:
import { Observable, Observer, Subscriber, Subject, Subscription } from 'rxjs';
import 'rxjs/add/operator/filter';
class TruthyObservable<T> extends Observable<T> {
constructor(subscribe?: <R>(this: Observable<T>, subscriber: Subscriber<R>) => any) {
if (subscribe) {
let oldSubscribe = subscribe;
subscribe = (obs: Subscriber<any>) => {
obs = this.appendOperators(obs);
return oldSubscribe.call(this, obs);
};
}
super(subscribe);
}
private appendOperators(obs: Subscriber<any>) {
let subject = new Subject();
subject
.filter((val: number) => val % 2 == 0)
.subscribe(obs);
return new Subscriber(subject);
}
}
let o = new TruthyObservable<number>((obs: Observer<number>) => {
obs.next(3);
obs.next(6);
obs.next(7);
obs.next(8);
});
o.subscribe(val => console.log(val));
这将打印到控制台:
6
8
见现场演示:https://jsbin.com/recuto/3/edit?js,console
一般类继承Observable
覆盖的_subscribe()
方法实际上使国内,而且在我们的例子中,我们要使用回调,我们可以自己发出值认购(因为这可观察到不发射任何东西本身)。方法_subscribe()
被_subscribe
属性掩盖,如果它存在,所以我们将无法追加任何运算符到它,如果我们只是否认这种方法。这就是为什么我在与其他功能的构造包裹_subscribe
,然后通过appendOperators()
法filter()
链一Subject
通过所有值。请注意,我用Subject
替换了原来的观察者obs = this.appendOperators(obs)
。
在当我打电话例如结束。 obs.next(3);
我实际上将价值推向Subject
,过滤它们并将它们传递给原始的Observer
。
您希望在哪里添加'.filter(x => x);'?如果您试图始终将标准RxJS运算符附加到您的自定义运算符上,我会理解它。 – martin
@martin我希望在任何其他操作符之前,操作符将被添加到类实例化中。 – estus
运算符不是扩展了'Rx.Observable'的类。这是其原型上的一种方法。无论如何,我想你的意思是'this.filter(布尔)'? – 2016-12-28 19:36:53