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