BehaviorSubject 订阅者多次获取相同的 next() 元素

BehaviorSubject subscriber gets same next() element multiple times

我正在使用一个使用 BehaviorSubject 的 shareDataService,如下所示。我的问题是,每次我调用服务的 next() 方法时,任何其他组件中的侦听器订阅都会被调用多次,看起来它多次收到相同的消息。这是预期的行为吗?如何预防?

该服务是单例的。 我没有多次调用 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
        }
    });
}

能否尝试在 ngOnDestroy() 生命周期钩子中调用 unsubscribe

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

希望对您有所帮助!

每次添加一个新的订阅ngDoCheck() is called. Try using first()只获取一次值然后自动取消订阅。

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

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


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

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

我也遇到了类似的问题,我发现我没有毁掉我的 next()

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

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

万事如意!!!