Observable
类如何通过应用内置的 RxJS 运算符来扩展它?
我想做这样的事情:
class TruthyObservable extends Observable {
constructor(subscriber) {
super(subscriber);
return this.filter(x => x);
}
}
class TruthyMappedObservable extends TruthyObservable {
constructor(subscriber) {
super(subscriber);
return this.map(x => `'${x}'`);
}
}
这可以在没有构造函数返回的情况下完成吗?
最佳答案
这在很大程度上取决于您想要做什么,但假设您想要制作一个行为非常类似于默认 Observable.create(...)
的 TruthyObservable
> 但只传递偶数:
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()
方法,但在我们的例子中,我们想使用回调,我们可以自己发出值(因为这个 Observable 本身不发射任何东西)。如果 _subscribe()
方法存在,它会被 _subscribe
属性遮盖,因此如果我们只是覆盖此方法,我们将无法向其添加任何运算符。这就是为什么我用另一个函数将 _subscribe
包装在构造函数中,然后通过与 appendOperators 中的
方法。请注意,我在 filter()
链接的 Subject
传递所有值()obs = this.appendOperators(obs)
处用 Subject
替换了原来的 Observer。
最后,当我调用 eg. obs.next(3);
实际上,我将值推送到 Subject
,过滤它们并将它们传递给原始的 Observer
。
关于javascript - 使用运算符扩展 RxJS Observable 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41366938/