выполнить некоторую функцию при прибытии нового наблюдателя в Angular BehaviorSubject

#angular #typescript #rxjs

#angular #typescript #rxjs

Вопрос:

Я хотел бы выполнить некоторую функцию при прибытии нового наблюдателя для BehaviorSubject в Angular.

 export class MyClass {
  public bs: BehaviorSubject<string> = new BehaviorSubject<string>('');
  private observerCount: number = 0;

    :

  private someFunction() {
    this.observerCount  ;
  }
    
  private checkNewObservers() {      
    setInterval( () => {
      for (const o of this.bs.observers) {
        if (...) { // o is a new observer
          someFunction(); // I would like to do this immediately after a new observer arrives.
        }
      }
    }, 1000);
  }
}
  

Вероятно, я могу сделать это с помощью кода, подобного приведенному выше. Но это будет отложено до someFunction выполнения. Я хотел бы выполнить someFunction сразу после прибытия нового наблюдателя.

Как я могу это сделать?

Комментарии:

1. почему вы не подписываетесь на него?

Ответ №1:

Вместо повторной проверки наличия новых наблюдателей вы можете достичь того, что ищете, расширив BehaviorSubject , чтобы принять обратный вызов для выполнения при добавлении наблюдателя, как показано ниже:

BehaviorSubject с уведомителем

 class BehaviorSubjectWithNotifier<T> extends BehaviorSubject<T>{
  public notifier: Function;

  constructor(value: T, notifier: Function) {
    super(value);
    this.notifier = notifier;
  }

  _subscribe(subscriber: Subscriber<T>): Subscription {
    this.notifier()
    return super._subscribe(subscriber);
  }
}
  

Пример использования:

 const x = new BehaviorSubjectWithNotifier(VALUE, () => console.log("observer added"));

x.subscribe() // new obsever has been added
x.subscribe() // new obsever has been added
x.subscribe() // new obsever has been added
  

Идем еще дальше

вместо использования функции обратного вызова используйте Subject для отслеживания текущего количества наблюдателей, чтобы вы могли получать уведомления о добавлении нового наблюдателя следующим образом:

 class BehaviorSubjectWithNotifier<T> extends BehaviorSubject<T>{
  public count$ = new Subject<number>();

  _subscribe(subscriber: Subscriber<T>): Subscription {
    this.count$.next(this.observers.length); // push current observers number
    return super._subscribe(subscriber);
  }

  unsubscribe(){
    this.count$.unsubscribe();
    super.unsubscribe()
  }
}
  

Пример использования:

 const subject = new BehaviorSubjectWithNotifier(VALUE);

subject.count$.subscribe(count => {
  // run some code
})
  

Комментарии:

1. Это ответ, который я собирался предложить.