在到达Angular BehaviorSubject中的新观察者时执行一些功能



当Angular中的BehaviorSubject有新的观察者到达时,我想执行一些函数。

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

也许我可以用上面的代码来完成。但是它将被延迟直到CCD_ 1被执行。我希望在新的观察者到达后立即执行someFunction

我该怎么做?

您可以通过扩展BehaviorSubject来接受回调以在添加观察者时执行,而不是重复检查新的观察者,如下所示:

BehaviorSubject With Notifier

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

最新更新