gpt4 book ai didi

angular - BehaviourSubject 的 Observable 不断通知取消订阅的 Subscription

转载 作者:行者123 更新时间:2023-12-01 08:35:35 36 4
gpt4 key购买 nike

有一项服务用于读取初始持久值 - “settings”,并通过可观察的“settings$”将它们提供给订阅者 - 组件。多个组件使用“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);
}
...
}

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

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

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

尽管如此,订阅仍然有效:

settingsSubscription.unsubscribe;

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

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

settingsService.notifySubscribers(s)

问题是:

  1. 怎么会出现:“settingsSubscription.unsubscribe;”不取消订阅吗?

  2. 如何解决这个问题?

最佳答案

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

.unsubscribe();

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

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

获取第一条数据后会自动取消订阅。

关于angular - BehaviourSubject 的 Observable 不断通知取消订阅的 Subscription,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58745108/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com