Subject‹any› поймайте методы подписки и отписки

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

 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;
}

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


person Nicu    schedule 03.08.2016    source источник
comment
В чем причина наличия только одного подписчика? Технически было бы непрозрачно, если бы вы бросали, когда происходит вторая подписка   -  person paulpdaniels    schedule 04.08.2016
comment
У меня есть глобальный диалог формы, и я хочу, чтобы у положительного действия был один подписчик, чтобы кто-то, кто будет его использовать, не подписывался дважды на одно и то же событие. Я исправил проблему, расширив тему Rxjs   -  person Nicu    schedule 04.08.2016
comment
Цель броска - убедиться, что программист правильно использует API.   -  person Nicu    schedule 04.08.2016


Ответы (1)


Возможное исправление, которое выглядит довольно чистым, состоит в том, чтобы расширить класс 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);
    }
}
person Nicu    schedule 04.08.2016