Angular Subject.complete()是否取消订阅所有侦听器?
我使用以下方法构建了一个简单的确认对话框服务(Angular 2):Angular Subject.complete()是否取消订阅所有侦听器?,angular,rxjs,observable,Angular,Rxjs,Observable,我使用以下方法构建了一个简单的确认对话框服务(Angular 2): confirm(body?: string, title?: string): Subject<void> { this.confirmation = new Subject<void>(); // ... show dialog here... "are you sure?" return this.confirmation; } _onYesClicked() { //
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();
}
如果有人使用该服务,他将返回一个主题(这是一个可观察的主题),并可以“订阅()。当单击“是”时调用订阅,因此给出了确认
这是正确的方法吗?更重要的是。。。电话会打到吗
this.confirmation.complete();
取消订阅订阅的侦听器,从而防止任何延迟引用(内存泄漏)?如果您想确保它删除所有观察者,您可以自己在中检查它。它在所有观察者上调用
complete()
(观察者通常只是实现的哑对象),然后设置this.observators.length=0代码>。所以答案是肯定的
您的方法是有效的,基本上与Angular2在EventEmitter
中经常使用的方法相同。只有一件事可以改进,那就是在暴露Subject
s时开始使用。这将隐藏您正在下方使用主题
的事实,并仅返回一个常规的可观察对象。这样,您就不会让您的用户在您的主题上意外地(或出于误解)尝试调用next()
、complete()
或error()
关于内存泄漏,这必须由RxJS处理,因此您不必担心它,如果有问题,作者可能会在您之前注意到
还可以看看这个:当用户单击“否”时,我也会调用error()而不是complete()。或者我会使用Promise而不是Observable。顺便说一句,ng引导模式就是这么做的。嘿嘿。。。这真是天才,只要看看资料来源——这让我确信没有保留任何参考资料。关于“asObservable()”的建议也很好-谢谢@JBNizet我认为单击“否”并不一定意味着错误,但这是OP的问题,我想不是我的问题。@JBNizet无意冒犯,但这只是一个糟糕的建议。调用error()以指示有效的用户流不是好的设计。代码错误被设计用来表示技术上出了问题,而不是表示用户在对话框中说了“不”。可以这样想:如果用户在一个对话框上单击“否”,该对话框会询问“你想炸毁世界吗?”,我认为这不是一个错误。简言之,错误是为未经处理的代码流设计的,这些代码流会导致程序中断,而不是指示在有效用例中下一步采用哪个逻辑分支。哇,这是一个多么好的答案啊!正因为如此,我今天学到了很多:)我编辑了这个标题,因为complete()
方法不是Obervable接口的一部分。
this.confirmation.complete();