Подписывает ли Subject.complete() все слушатели?

Я создаю простую службу диалога подтверждения (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"));

Если кто-то использует эту услугу, он возвращает объект (который является наблюдаемым) и может "подписаться" () на него. Подписка вызывается при нажатии "да", и поэтому подтверждение было дано...

Это правильный способ сделать это? И что более важно... будет вызов

this.confirmation.complete();

отказаться от подписки подписчиков и, следовательно, предотвратить любые затяжные ссылки (утечка памяти)?

Ответ 1

Если вы хотите быть уверены, что он удаляет все наблюдатели, вы можете проверить это сами на https://github.com/ReactiveX/rxjs/blob/master/src/Subject.ts#L82. Он вызывает complete() для всех наблюдателей (наблюдатели обычно являются просто тупыми объектами, реализующими интерфейс Observer), а затем устанавливает this.observers.length = 0; , Так что ответ - да.

Ваш подход верен, он в основном такой же, как и Angular2, который регулярно используется с EventEmitter. asObservable() что вы можете улучшить, - это начать использовать asObservable() при выставлении asObservable() Subject. Это скроет тот факт, что вы используете Subject внизу, и вернет только обычный Observable. Таким образом, вы не позволите своим пользователям случайно (или по недоразумению) попытаться вызвать next(), complete() или error() для вашего Subject.

Что касается утечки памяти, это должно быть обработано RxJS, так что вы не должны беспокоиться об этом, и если возникнут проблемы, авторы, вероятно, заметят это перед вами.

Также взгляните на это: Observable vs Subject и asObservable