BehaviorSubject 订阅者多次获取相同的 next() 元素
BehaviorSubject subscriber gets same next() element multiple times
我正在使用一个使用 BehaviorSubject 的 shareDataService,如下所示。我的问题是,每次我调用服务的 next() 方法时,任何其他组件中的侦听器订阅都会被调用多次,看起来它多次收到相同的消息。这是预期的行为吗?如何预防?
该服务是单例的。
我没有多次调用 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
}
});
}
能否尝试在 ngOnDestroy()
生命周期钩子中调用 unsubscribe
ngOnDestroy() {
this.shareDataService.currentMessage.unsubscribe();
}
希望对您有所帮助!
每次添加一个新的订阅ngDoCheck()
is called. Try using first()
只获取一次值然后自动取消订阅。
ngDoCheck() {
this.shareDataService.currentMessage
.pipe(first())
.subscribe((message) => {
// Do stuff
}
});
}
下次触发ngDoCheck
时,它会添加另一个一次性订阅。
如果您订阅的唯一目的是在更改检测时获取当前值,您还可以向 ShareDataService 添加一个简单的 get() 函数以仅 return 它的当前值。
get() {
return this.messageSource.getValue();
}
我也遇到了类似的问题,我发现我没有毁掉我的 next()
。
请检查以下代码并将其添加到您的onDestroy
。希望对您有所帮助!
ngOnDestroy() {
this.messageSource.next();
}
万事如意!!!
我正在使用一个使用 BehaviorSubject 的 shareDataService,如下所示。我的问题是,每次我调用服务的 next() 方法时,任何其他组件中的侦听器订阅都会被调用多次,看起来它多次收到相同的消息。这是预期的行为吗?如何预防?
该服务是单例的。 我没有多次调用 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
}
});
}
能否尝试在 ngOnDestroy()
生命周期钩子中调用 unsubscribe
ngOnDestroy() {
this.shareDataService.currentMessage.unsubscribe();
}
希望对您有所帮助!
每次添加一个新的订阅ngDoCheck()
is called. Try using first()
只获取一次值然后自动取消订阅。
ngDoCheck() {
this.shareDataService.currentMessage
.pipe(first())
.subscribe((message) => {
// Do stuff
}
});
}
下次触发ngDoCheck
时,它会添加另一个一次性订阅。
如果您订阅的唯一目的是在更改检测时获取当前值,您还可以向 ShareDataService 添加一个简单的 get() 函数以仅 return 它的当前值。
get() {
return this.messageSource.getValue();
}
我也遇到了类似的问题,我发现我没有毁掉我的 next()
。
请检查以下代码并将其添加到您的onDestroy
。希望对您有所帮助!
ngOnDestroy() {
this.messageSource.next();
}
万事如意!!!