Angular Subject.complete()是否取消订阅所有侦听器?

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() { //

我使用以下方法构建了一个简单的确认对话框服务(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();
}
如果有人使用该服务,他将返回一个主题(这是一个可观察的主题),并可以“订阅()。当单击“是”时调用订阅,因此给出了确认

这是正确的方法吗?更重要的是。。。电话会打到吗

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();