2017-07-26 114 views
0

我想要查找在任何給定時間只支持一個訂閱的可觀察的主題或事件發射器替換。即第一個獲得訂閱的人將有權執行其訂閱的機構,並且當它退訂時,任何下一個訂閱者都將被允許繼續。rxjs observable的訂閱數量限制

目前是否有任何支持此功能的可觀察,主體或事件發射器內的方法或可用於此行爲的替換方法。

或者,如果有與當過有人贊同我可以執行一些功能,一些技術/我們的目標發射退訂然後我就可以使用訪問修飾符和一個布爾值執行此功能。

目前,我想是這樣的:

private OpenDialogEmitter = new EventEmitter(); 
    private isFirstFetch: boolean = true; 




getDialogEmitter(): EventEmitter<{}> { 

    if (this.isFirstFetch) { 
     this.isFirstFetch = false; 
     return this.OpenDialogEmitter; 
    } 
    return null; 
    } 


setFirstFetch(){ 
     this.isFirstFetch = true; 
} 

當曾經有人退訂它必須通過調用setFirstFetch()內的服務方法再次標記觀察到的可用。

有沒有更好的和內置的方法?

+0

我想rxjs是發生反應,沒有棱角? – rrd

+0

rxjs:庫在Angular中可用,不確定它是否可用於React。 –

+1

RxJS是一個獨立的圖書館。事實上,[它唯一的依賴](https://github.com/ReactiveX/rxjs/blob/5.4.2/package.json#L208-L210)是一個可觀察符號的小型填充。 – cartant

回答

1

很難告訴你爲什麼需要這個,因爲那裏是運營商,如share建議,以確保您始終只有一個訂閱源觀測。

由於EventEmitter擴展Subject類,你可以檢查是否有任何訂閱具有以下(見https://github.com/ReactiveX/rxjs/blob/master/src/Subject.ts#L28):

const source = new Subject(); 

... 

if (source.observers.length > 0) { 
    ... 
} 

如果你想在訂閱執行一些動作/退訂您可以使用Observable.defer()並添加定製推倒與add()方法起到將Subscription對象:

const source = new Subject(); 

const o = Observable.defer(() => { 
    console.log('subscription'); 
    return source; // or you can create the source inside this function if you want. 
}); 

const subscription = o.subscribe(...); 

subscription.add(() => { 
    console.log('unsubscription'); 
});