gpt4 book ai didi

angular - Subject.complete() 是否取消订阅所有听众?

转载 作者:太空狗 更新时间:2023-10-29 16:50:13 26 4
gpt4 key购买 nike

我使用这种方法构建了一个简单的确认对话框服务 (Angular 2):

confirm(body?: string, title?: string): Subject<void> {
this.confirmation = new Subject<void>();
// ... show dialog here... "are you sure?"
return this.confirmation;
}

_onYesClicked() {
// ... closing the dialog
this.confirmation.next();
this.confirmation.complete();
}

_onNoClicked() {
// ... closing the dialog
this.confirmation.complete();
}

用法:

confirmationService.confirm().subscribe(() => alert("CONFIRMED"));

如果有人使用该服务,他会得到一个返回的 Subject(这是一个 Observable)并且可以“订阅()”它。单击"is"时将调用订阅,因此会给出确认...

这是执行此操作的正确方法吗?更重要的是......会调用

this.confirmation.complete();

取消订阅已订阅的监听器,从而防止任何挥之不去的引用(内存泄漏)?

最佳答案

如果你想确保它删除了所有观察者,你可以在 https://github.com/ReactiveX/rxjs/blob/master/src/internal/Subject.ts#L91 中自行检查。 .它对所有观察者调用 complete()(观察者通常只是实现 Observer interface 的愚蠢对象),然后设置 this.observers.length = 0;。所以答案是肯定的。

您的方法是有效的,它与 Angular2 对 EventEmitter 的常规做法基本相同。您可以改进的一件事就是开始使用 asObservable()公开 Subject 时。这将隐藏您在下面使用 Subject 的事实,并只返回一个常规的 Observable。这样你就不会让你的用户意外(或误解)尝试调用 next()complete()error() 在你的 Subject 上。

关于内存泄漏,这必须由 RxJS 处理,所以您不必担心,如果有问题,作者可能会在您之前注意到。

也看看这个:Observable vs Subject and asObservable

关于angular - Subject.complete() 是否取消订阅所有听众?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40452979/

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