Уничтожение компонента является единственным событием.
this.destroy$.next();
this.destroy$.complete();
Гарантирует, что субъект излучает только один раз и завершает .
Например;
const destroy$ = new Subject();
destroy$.subscribe(v => console.log("destroyed"));
destroy$.next();
destroy$.complete();
destroy$.next();
// the above prints "destroyed" only once.
Это не техническое требование для завершения, но если вы этого не сделаете, то бизнес-логика, которая зависит от завершения вместо передачи, не всегда будет работать и может привести к утечке памяти.
Например, следующее будет утечка памяти в RxJs.
destroyed$.subscribe(() => {
console.log('This might leak memory');
});
Вышеуказанное может привести к утечке памяти, поскольку подписка никогда не заканчивается и наблюдаемое никогда не завершается. Вы можете устранить утечку, добавив оператор first()
или убедившись, что тема завершена. RxJS не знает, что субъект будет излучать только одно значение, и поэтому вы должны сказать это. В противном случае подписчики остаются привязанными к стековому фрейму и не собираются мусором. Таким образом, хотя сборщик мусора может собирать компонент после его использования, если что-либо ссылается на фрейм стека подписчика, эта подписка действует.
Итак, назовите complete на предметах уничтожения, чтобы другие люди не ошибались.
this.destroy $ .unsubscribe ()
Вызов отмена подписки по теме может не повлиять на последующих операторов, которые создают внутренние подписки. Например, switchMap()
и mergeMap()
создают внутренние подписки.
Таким образом, вы не можете эффективно управлять подписками выше. Отказаться от подписки, созданной при вызове метода subscribe()
, лучше, потому что он последний в цепочке операторов.