Ответ 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