Жизненный цикл подписки Rx JS в Angular - PullRequest
0 голосов
/ 13 апреля 2020

В нескольких руководствах и документации, которые я прочитал о Angular наблюдаемых, я видел много предупреждений о том, как отказ от подписки на подписку может привести к утечке памяти (если только не используется канал asyn c в шаблон компонента).

В моем приложении есть несколько классов поддержки, в которых я создаю настраиваемые наблюдаемые, но мне было интересно, важно ли отменить их подписку, если и наблюдаемый, и все подписчики go находятся вне области видимости , Например, у меня есть родительский класс, который содержит карту дочерних объектов в массиве. Родитель подписывается на наблюдаемое для каждого из его дочерних элементов, чтобы обнаруживать изменения в свойстве «value», а родительский объект пересчитывает свое свойство «total» всякий раз, когда дочерний элемент изменяет свое значение.

Затем скажите, что родительский объект выходит из области видимости, и, как правило, родитель и все дочерние элементы будут собираться мусором, если вокруг не остается никаких живых ссылок ни на один из дочерних объектов. Нужно ли, чтобы родитель отказался от подписки на каждую из подписок childchange, чтобы подписка была выпущена? Или сама подписка собирает мусор, когда подписчики или наблюдаемый объект go выходят за рамки? Или сама активная подписка будет поддерживать жизнь родителя и, следовательно, всех детей?

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Как только источник Observable подвергается сборке мусора, все обратные вызовы подписок также собираются и все объекты, на которые ссылаются обратные вызовы, таким образом, не представляют реального риска. Все наблюдаемые Angular имеют собственный жизненный цикл и уничтожаются, когда они больше не нужны (HttpClient, параметры маршрута, охранники, распознаватели и т. Д. c ...), поэтому нет необходимости беспокоиться о unsubscribe когда вы subscribe к Angular Observable.

Опасными Наблюдаемыми являются те, которые вы создаете и для которых вы не управляете жизненным циклом правильно, они могут жить вечно и могут иметь ссылки на обратные вызовы, которые имеют ссылки на объекты (например, компоненты). Здесь вы можете найти более подробную информацию о том, как могут происходить утечки памяти: Нужно ли мне отписываться от Observable, если Observable заканчивается?

0 голосов
/ 13 апреля 2020

Да, вам нужно отменить подписку на изменения стоимости. В angular HttpModule - единственный, который вам не нужно отписываться, так как он отписывается после выполнения http-запроса (в httpModule)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...