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

时间:2016-11-06 18:30:46

标签: 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() {
  // ... closing the dialog
  this.confirmation.next();
  this.confirmation.complete();
} 

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

用法:

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

如果有人使用该服务,他会返回一个Subject(这是一个Observable)并且可以“订阅()”。当点击“是”时调用订阅,因此确认给出了......

这是正确的方法吗?更重要的是...将致电

this.confirmation.complete();

取消订阅订阅的侦听器,从而防止任何延迟引用(内存泄漏)?

1 个答案:

答案 0 :(得分:29)

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

您的方法是有效的,它与Angular2定期与EventEmitter基本相同。您可以改进的一件事是在展示Subject时开始使用asObservable()。这将隐藏您在下面使用Subject并返回常规Observable的事实。这样您就不会让用户偶然(或误解)尝试拨打next()上的complete()error()Subject

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

另请看一下:Observable vs Subject and asObservable