Angular 行为主体订阅被调用两次
我有两个组件,它们使用Angular 行为主体订阅被调用两次,angular,Angular,我有两个组件,它们使用BehaviorSubject进行通信。这里有一个简单的重述: 仪表板组件: this.service.setCheckIsTrue(); 服务: private $checkIsTrue = new BehaviorSubject<any>(null); public checkIsTrueEvent = this.$checkIsTrue.asObservable(); public setCheckIsTrue(){ this.$checkIs
BehaviorSubject
进行通信。这里有一个简单的重述:
仪表板组件:
this.service.setCheckIsTrue();
服务:
private $checkIsTrue = new BehaviorSubject<any>(null);
public checkIsTrueEvent = this.$checkIsTrue.asObservable();
public setCheckIsTrue(){
this.$checkIsTrue.next(true);
}
private$checkIsTrue=newbehaviorsubject(null);
public checkIsTrueEvent=this.$checkIsTrue.asObservable();
public setCheckIsTrue(){
此.$checkIsTrue.next(真);
}
其他组成部分:
this.composerService.checkIsTrueEvent
.takeWhile(() => this.isAlive)
.subscribe( res => {
if(!!res && res){
console.log("fired"); // <-- called twice
}
});
this.composerService.checkIsTrueEvent
.takeWhile(()=>this.isAlive)
.订阅(res=>{
如果(!!res&&res){
console.log(“fired”);//您正在使用初始值为null的BehaviorSubject
,它将第一次通知所有订户。然后通过this.$checkIsTrue.next(true);
设置下一个值,它将触发下一个通知
如果您不担心最后一个值,那么您可以简单地使用Subject
而不是BehaviorSubject
private $checkIsTrue = new Subject<any>();
private$checkIsTrue=newsubject();
您正在使用初始值为null的BehaviorSubject
,它将第一次通知所有订户。然后您通过this.$checkIsTrue.next(true);
设置下一个值,它将触发下一个通知
如果您不担心最后一个值,那么您可以简单地使用Subject
而不是BehaviorSubject
private $checkIsTrue = new Subject<any>();
private$checkIsTrue=newsubject();
使用条件
this.composerService.checkIsTrueEvent.takeWhile(() => this.isAlive).subscribe( res => {if('undefined' != typeof res){
console.log("fired");// <----called once }
});
this.composerService.checkIsTrueEvent.takeWhile(()=>this.isAlive).subscribe(res=>{if('undefined')!=typeof res){
console.log(“已激发”);//使用条件
this.composerService.checkIsTrueEvent.takeWhile(() => this.isAlive).subscribe( res => {if('undefined' != typeof res){
console.log("fired");// <----called once }
});
this.composerService.checkIsTrueEvent.takeWhile(()=>this.isAlive).subscribe(res=>{if('undefined')!=typeof res){
console.log(“fired”);//当这种情况发生在我身上时,我会反复思考,直到我意识到我忘记取消订阅组件的Ngondestory()。尝试一下。:当这种情况发生在我身上时,我会反复思考,直到我意识到我忘记取消订阅组件的Ngondestory()。尝试一下。:)根据我的经验,大多数情况下它取决于调用函数的位置。如果在构造函数中调用它,大多数情况下它会调用两次并生成错误(有时)。您可以在ngOnInit()中调用它。因此它不会产生任何错误,也不会调用函数两次
另外,我在BehaviorSubject和Subject中尝试了这一方法,但没有任何更改。因此,您可以尝试上面的方法。根据我的经验,大多数情况下,这取决于您要调用函数的位置。大多数情况下,它会调用两次并生成错误(有时)如果您在构造函数中调用它。您可以在ngOnInit()中调用它。因此它不会生成任何错误,也不会调用函数两次
另外,我用BehaviorSubject和Subject尝试了这一方法,没有任何更改。因此,您可以尝试上面的方法。在使用setCheckIsTrue()的地方显示代码
位于构造函数OK中,请使用主题而不是行为主题。行为主题所做的正是文档中所说的。在使用setCheckIsTrue()的位置显示代码
在构造函数中,请使用主题,而不是行为主题。行为主题正按照文档中的说明进行操作。问题仍然存在,请您对此进行注释。$checkIsTrue.next(true)
并检查它调用了多少次。它以随机方式自行解决。不知道如何解决,我没有改变任何东西你的意思是它与行为主体
一起工作很好?事情不只是自行解决。@SunilSingh通过使用主题
与BS来解决它,那么你改变了什么或发现了什么吗?问题persist,sadlyCan您可以评论this.$checkIsTrue.next(true)
并检查它调用了多少次。它以随机方式自行解决。不知道如何解决,我没有改变任何东西。你的意思是说它与行为主体
配合使用很好?事情不只是自行解决。@SunilSingh通过使用主题
与BS来解决它,那么你改变了什么或发现了什么吗?谢谢我使用takeWhile操作员取消订阅。在问了这个问题(随机)几个月后,我解决了这个问题发现该服务是在两个不同的模块中提供的。哈,在添加我的答案之前应该先查看一下。是的,这是我的问题。在导航离开某个组件时没有删除旧订阅。返回页面并初始化该组件的另一个实例添加了另一个订阅,因此我获得了多个订阅呼叫每个下一个()。谢谢你的建议。我使用takeWhile操作员取消订阅。我在问了这个问题(随机)几个月后解决了这个问题发现该服务是在两个不同的模块中提供的。哈,在添加我的答案之前应该先查看一下。是的,这是我的问题。在导航离开某个组件时没有删除旧订阅。返回页面并初始化该组件的另一个实例添加了另一个订阅,因此我获得了多个订阅调用每个下一个()。感谢您的回复,正如我在上面的一条评论中所说,错误已解决,修复了我在给定时间内在运行时存在的两个不同模块中提供服务的事实。感谢您的回复,正如我在上面的一条评论中所说,错误已解决,修复了我在两个不同模块中提供服务的事实在给定时间的运行时