可观察到的BehaviorSubject不断通知未订阅的订阅

时间:2019-11-07 08:56:54

标签: angular typescript observable

有一项服务用于读取初始持久值-“ settings ”,并通过可观察的“ settings $ ”将其提供给订户-组件。几个组件使用可观察到的“ settings $ ”来检索初始持久值,并在它们之间进一步交换更新后的值。为此,在服务中实现了BehaviorSubject。在这里一切都很好。

constructor(private settingsService: SettingsService, ...) { ... }

ngOnInit() {
  const settingsSubscription = this.settingsService.settings$.subscribe(o => 
  {
      merge(this.persistedSettings, o);
      ...
  });
  ...
  settingsSubscription.unsubscribe;
}

一个组件也需要初始持久数据,但是不需要有关“设置”中进一步更新的进一步通知。因此,它最初订阅获取初始持久性数据,然后取消订阅以避免得到任何进一步的更新-像这样。

settingsSubscription.unsubscribe;

但是,尽管有以下情况,订阅仍然有效:

settingsService.notifySubscribers(s)

订阅中的部分:       {           merge(this.persistedSettings,o);           ...       });

当任何组件使用服务和功能时,总是会触发

tags

问题是:

  1. “ settingsSubscription.unsubscribe;” 不会取消订阅?

  2. 如何解决?

1 个答案:

答案 0 :(得分:5)

unsubscribe是一种方法,而不是属性,因此您需要使用(),它将变为:

.unsubscribe();

如果目标是订阅并仅获取初始持久数据,则可以使用:take(1)

this.settingsService.settings$.pipe(take(1)).subscribe(...)

它将在获取第一个数据后自动退订。