我有两个使用BehaviorSubject
进行通信的组件。这是一个简单的复制:
DashboardComponent:
this.service.setCheckIsTrue();
服务:
private $checkIsTrue = new BehaviorSubject<any>(null);
public checkIsTrueEvent = this.$checkIsTrue.asObservable();
public setCheckIsTrue(){
this.$checkIsTrue.next(true);
}
其他组件:
this.composerService.checkIsTrueEvent
.takeWhile(() => this.isAlive)
.subscribe( res => {
if(!!res && res){
console.log("fired"); // <-- called twice
}
});
我还有其他BS可以正常工作,因此我检查了代码,并且一次调用了函数setCheckIsTrue()
。我可以使用一些rxjs
运算符来解决此问题,但这不是真正的解决方案。有人对此有想法吗?
答案 0 :(得分:0)
您正在使用初始值为BehaviorSubject
的{{1}},它将初次通知所有订户。然后,通过null
设置下一个值,这将触发下一个通知。
如果您不介意最后一个值,则可以直接使用this.$checkIsTrue.next(true);
而不是Subject
。
BehaviorSubject
答案 1 :(得分:0)
使用条件
this.composerService.checkIsTrueEvent.takeWhile(() => this.isAlive).subscribe( res => {if('undefined' != typeof res){
console.log("fired");// <----called once }
});
答案 2 :(得分:0)
当我遇到这种情况时,我I了一下,直到我意识到我已经忘记退订该组件的ngOnDestroy()了。试试看。 :)
答案 3 :(得分:0)
根据我的经验,在大多数情况下,这取决于要在哪里调用该函数。在大多数情况下,如果您在构造函数中使用它调用它,它将调用两次并有时会产生错误。您可以在 ngOnInit()中调用它。因此它不会产生任何错误,也不会两次调用该函数。
此外,我尝试使用 BehaviorSubject 和 Subject 注意到这一点进行了尝试。因此,您可以尝试以上操作。