【发布时间】:2019-02-15 00:43:32
【问题描述】:
我正在尝试对我的代码进行故障排除。 我希望订阅会在 .next() 和初始化时触发。
但它第一次触发一次,然后我离开并返回组件并触发下一个,它会触发两次。 我导航离开并返回,它会触发三次。
我检查了所有调用 .next() 的函数,它们只被触发一次,但订阅仍在增加。
我的行为主体在服务内,当我点击一个组件时,它会调用服务内的下一个函数。
关于我可以在哪里检查问题或如何检查的任何想法
【问题讨论】:
我正在尝试对我的代码进行故障排除。 我希望订阅会在 .next() 和初始化时触发。
但它第一次触发一次,然后我离开并返回组件并触发下一个,它会触发两次。 我导航离开并返回,它会触发三次。
我检查了所有调用 .next() 的函数,它们只被触发一次,但订阅仍在增加。
我的行为主体在服务内,当我点击一个组件时,它会调用服务内的下一个函数。
关于我可以在哪里检查问题或如何检查的任何想法
【问题讨论】:
从您的描述看来,您并没有取消订阅组件中的 BehaviorSubject。如果您不取消订阅,那么每次初始化该组件(导航到它)时,您都会创建一个对行为主题的新订阅。由于您在导航离开时没有取消订阅该 BehaviorSubject,因此该订阅保持活动状态。因此,当您第二次返回时,会创建另一个订阅,然后您会开始收到多个 next() 通知。这种行为称为内存泄漏。
在您订阅行为主题的组件中,您需要执行以下操作:
export class AppComponent implements OnInit, OnDestroy {
private mySub;
constructor(private yourService: YourService){}
ngOnInit(){
this.mySub = this.yourService.yourBehaviorSubject.subscribe({
next: _ => //Do stuff
});
}
ngOnDestroy(){
this.mySub.unsubscribe();
}
}
这当然是关于您的根本问题是什么的猜测,因为您没有提供任何代码!如果我的怀疑是错误的,请提供一些代码。那将有很大帮助! :)
【讨论】:
您需要在将组件保留为时取消订阅
ngOnInit(){
this.subscriptionObj1 = this.service.behaviorSubject1.subscribe({
});
this.subscriptionObj2 = this.service.behaviorSubject2.subscribe({
});
}
ngOnDestroy(){
this.subscriptionObj1.unsubscribe();
this.subscriptionObj2.unsubscribe();
}
或者,如果您懒得检查所有代码中出现的所有主题订阅。 :)
只需添加 pipe(first()) 它将在第一次执行后自动取消订阅对象。
import { first, take } from 'rxjs/operators';
ngOnInit(){
this.service.behaviorSubject1.pipe(first()).subscribe({
});
this.service.behaviorSubject2.pipe(first()).subscribe({
});
}
【讨论】: