2016-12-28 96 views
4

可观察类如何Observable类应用内置RxJS运营商是否将其延长?扩展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}'`); 
    } 
} 

可这没有构造回报做些什么呢?

+0

您希望在哪里添加'.filter(x => x);'?如果您试图始终将标准RxJS运算符附加到您的自定义运算符上,我会理解它。 – martin

+0

@martin我希望在任何其他操作符之前,操作符将被添加到类实例化中。 – estus

+0

运算符不是扩展了'Rx.Observable'的类。这是其原型上的一种方法。无论如何,我想你的意思是'this.filter(布尔)'? – 2016-12-28 19:36:53

回答

2

这几乎取决于你想要做的,但假设你想一个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

1

我认为你可以得到你需要与运营商定制的内容:

Observable.prototype.truthy = function truthy() { 
     return this.filter(x => x); 
    } 
+0

谢谢,它可以这样做。但是,问题是关于如何通过继承来完成,我也不打算修改原型。 – estus

+0

@estus,你能否给我提供'TruthyObservable'的用例/例子? –

+0

我主要了解如何正确扩展RxJS,尤其是“可观察”。我打算使用扩展的'Observable'作为Angular 2服务,它在Typescript中的类更好。 – estus