BehaviorSubject订阅被调用两次

时间:2018-11-16 10:30:16

标签: angular

我有两个使用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运算符来解决此问题,但这不是真正的解决方案。有人对此有想法吗?

4 个答案:

答案 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 注意到这一点进行了尝试。因此,您可以尝试以上操作。