我正在使用通过 BehaviorSubject 进行的shareData服务,如下所示。我的问题是,每次我从一个组件调用服务的 changeMessage 方法时,任何其他组件中的监听器 messageSource 订阅都会被调用多次,看起来它多次收到相同的消息次。这是预期的行为吗?如何预防呢?
该服务为单例。 我不会多次拨打 changeMessage
@Injectable()
export class ShareDataService {
messageSource = new BehaviorSubject(someData);
currentMessage: Observable = this.messageSource.asObservable();
changeMessage(message) {
this.messageSource.next(message);
}
}
组件中的订阅
ngDoCheck() {
this.shareDataService.currentMessage
.pipe(takeUntil(this.ngUnsubscribe))
.subscribe((message) => {
//Do stuff
}
});
}
答案 0 :(得分:1)
每次调用ngDoCheck()
时都会添加一个新的订阅。尝试使用first()
仅获取一次值,然后自动取消订阅。
ngDoCheck() {
this.shareDataService.currentMessage
.pipe(first())
.subscribe((message) => {
// Do stuff
}
});
}
下一次触发ngDoCheck
时,它将添加另一个一次性订阅。
如果订阅的唯一目的是获取更改检测的当前值,则还可以向ShareDataService添加一个简单的get()函数以仅返回其当前值。
get() {
return this.messageSource.getValue();
}
答案 1 :(得分:0)
能否请您尝试在您的unsubscribe
生命周期挂钩中调用ngOnDestroy()
ngOnDestroy() {
this.shareDataService.currentMessage.unsubscribe();
}
希望这会有所帮助!
答案 2 :(得分:0)
我也面临类似的问题,我发现我没有销毁next()
。
请检查以下代码,并将其添加到您的onDestroy
中。希望对您有帮助!
ngOnDestroy() {
this.messageSource.next();
}
万事如意!