2016-12-28 110 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