BehaviorSubject订户多次获得相同的next()元素

时间:2018-07-23 11:54:04

标签: angular rxjs subscribe behaviorsubject

我正在使用通过 BehaviorSubject 进行的shareData服务,如下所示。我的问题是,每次我从一个组件调用服务的 changeMes​​sage 方法时,任何其他组件中的监听器 messageSource 订阅都会被调用多次,看起来它多次收到相同的消息次。这是预期的行为吗?如何预防呢?

该服务为单例。 我不会多次拨打 changeMes​​sage

@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
        }
    });
}

3 个答案:

答案 0 :(得分:1)

每次调用ngDoCheck()时都会添加一个新的订阅。尝试使用first()仅获取一次值,然后自动取消订阅。

ngDoCheck() {
    this.shareDataService.currentMessage
        .pipe(first())
        .subscribe((message) => {
            // Do stuff
        }
    });
}

下一次触发ngDoCheck时,它将添加另一个一次性订阅。


如果订阅的唯一目的是获取更改检测的当前值,则还可以向ShareDataService添加一个简单的get()函数以仅返回其当前值。

get() {
    return this.messageSource.getValue();
}

答案 1 :(得分:0)

能否请您尝试在您的unsubscribe生命周期挂钩中调用ngOnDestroy()

ngOnDestroy() {
    this.shareDataService.currentMessage.unsubscribe();
}

希望这会有所帮助!

答案 2 :(得分:0)

我也面临类似的问题,我发现我没有销毁next()

请检查以下代码,并将其添加到您的onDestroy中。希望对您有帮助!

ngOnDestroy() { this.messageSource.next(); }

万事如意!