2016-08-03 1 views
0

Я хочу заставить субъект rxjs иметь только одного абонента за раз. и я хочу, чтобы подсчитать количество подписок для обеспечения условиюТема <any> улавливать методы подписки и отписки

import { Subject } from 'rxjs/Subject'; 


/** 
* FormDialogActionModel 
*/ 
export class FormDialogActionModel { 
    public $customAction: Subject<CustomAction> = new Subject<CustomAction>(); 

    private positiveActionSubscribers: number = 0; 
    private customActionSubscribers: number = 0; 
    private $positiveAction: Subject<Object> = new Subject<Object>();  
    private internalToken = 'FORM-DIALOG-SERVICE-GET-POSITIVE-ACTION-WITHOUT-TRIGGERING-GET-RESTRICTIONS'; 

    /** 
    * This get method was created to force the number of subscribers to 1 
    */ 
    public get $$positiveAction(): Subject<Object> { 
     this.positiveActionSubscribers ++; 
     if(this.positiveActionSubscribers > 1){ 
      throw new Error('Somebody already subscribed to a positive action. You cannot subscribe to it again until the subscribes unsubscribes');    
     } 

     return this.$positiveAction;  
    } 

    public unSubscribePositiveAction(){ 
     this.positiveActionSubscribers --; 
    } 

    public getPositiveAction(token){ 
     if(token != this.internalToken){ 
      throw new Error('The get mothod getPositiveAction was created only for form-dialog.service'); 
     } 

     return this.$positiveAction; 
    } 
} 

export interface CustomAction { 
    data: Object; 
    customActionIdentifier: string; 
} 

Есть ли способ, чтобы кэшировать подписываться событие и increse счетчика и отказаться от подписки на decrese это? Я хочу, чтобы другие clases не знаю , что происходит позади, и это один будет вынужден иметь только один абонент вовремя

+0

Что такое рассуждение позади имея только один абонент? Технически это было бы непрозрачно, если вы бросаете, когда происходит вторая подписка. – paulpdaniels

+0

У меня есть диалоговое окно глобальной формы, и я хочу заставить позитивное действие иметь одного абонента, поэтому кто-то, кто его использует, не будет подписываться дважды на одно и то же событие. Я исправил проблему, расширив тему Rxjs – Nicu

+0

Цель броска - убедиться, что программист правильно использует api – Nicu

ответ

0

Возможное исправление, которое выглядит довольно чистым, чтобы расширить класс Subject и использовать эту реализацию вместо

import { Subject } from 'rxjs/Subject'; 
import { Observer } from 'rxjs/Observer'; 
import { Observable } from 'rxjs/Observable'; 
import { PartialObserver } from 'rxjs/Observer'; 
import { Subscription } from 'rxjs/Subscription'; 

export class RxSingleSubject<T> extends Subject<T>{ 

    constructor(destination?: Observer<T>, source?: Observable<T>) { 
     super(destination, source); 
    } 

    subscribe(observerOrNext?: PartialObserver<T> | ((value: T) => void), error?: (error: any) => void, complete?:() => void): Subscription { 
     if(this.observers.length == 1){ 
      throw new Error("RxjsSingleSubject does not support more then one subscriber.");    
     } 

     return super.subscribe(observerOrNext, error, complete); 
    } 
}