Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 行为主体的可观察性不断通知未订阅订阅_Angular_Typescript_Observable - Fatal编程技术网

Angular 行为主体的可观察性不断通知未订阅订阅

Angular 行为主体的可观察性不断通知未订阅订阅,angular,typescript,observable,Angular,Typescript,Observable,有一个服务用于读取初始持久值-“设置”,并通过可观察的“设置$”向订阅者组件提供它们。有几个组件使用“settings$”可观察值来检索初始持久值,并在它们之间进一步交换更新后的值。为此,将在服务中实现BehaviorSubject。这里一切都很好 @Injectable() export class SettingsService implements OnInit { settingsBS; settings$: Observable<SettingsI>; i

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

@Injectable()
export class SettingsService implements OnInit {

  settingsBS; 
  settings$: Observable<SettingsI>;

  init() {
    this.settingsBS = new BehaviorSubject<SettingsI>(defaultSettings);
    this.settings$ = this.settingsBS.asObservable();
    ...
    let s: SettingsI;
    this.loadPersistedSettings(s);
                       // notify subscribers about the 
                       // loaded persisted settings 
                       // and pass these settings to them
    this.notifySubscribers(s);
    ...
  }
                      // this function is also used by components
                      // to pass new/updated settings to subscribers
  public notifySubscribers(s: SettingsI) {
    this.settingsBS.next(s);
  }
  ...
}
但是,尽管存在以下情况,订阅仍然有效:

settingsSubscription.unsubscribe;
订阅中的部分: { 合并(this.persistedSettings,o); ... });

总是在任何组件使用服务和功能时触发:

settingsService.notifySubscribers(s)
问题是:

  • 为什么会这样:“设置订阅。取消订阅 不取消订阅吗

  • 如何解决这个问题


  • 取消订阅
    这是一种方法而不是属性,因此您需要使用
    ()
    ,它将成为:

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


    它将在获得第一个数据后自动取消订阅。

    非常快速地观察到错误-丢失()。我想知道为什么我没有收到IDE或编译器的警告。这既不是编译错误,也不是运行时错误。简单地说,这不是一个错误,但它不是你想要做的
    .unsubscribe();
    
    this.settingsService.settings$.pipe(take(1)).subscribe(...)