#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. Это ответ, который я собирался предложить.