Как мы знаем, подписки, созданные в компоненте, не будут уничтожены вместе с компонентом. Когда мы используем наблюдаемые объекты в RxJS и хотим подписаться на них, мы также должны помнить об отказе от подписки, чтобы предотвратить утечку памяти, или прерывать HTTP-запросы, чтобы избежать нежелательных вызовов. У меня есть для вас решение, чтобы вам больше не пришлось об этом вспоминать 🙌.
Но сначала основы 🙂
Есть несколько вариантов, которые мы можем использовать, чтобы отказаться от подписки.
1️⃣ Первый из них — просто создать массив и запихнуть туда свои подписки, а в методе жизненного цикла ngOnDestroy()
просто отписать их все. Вот пример:
2️⃣ Второй очень похожий способ — создать переменную типа Subscription
и добавить к ней подписки. На мой взгляд, это решение лучше, чем предыдущее, потому что вам нужно использовать только метод unsubscribe()
и все добавленные подписки будут уничтожены, вам не нужно использовать цикл и отписываться для каждой из них. Это будет выглядеть так:
3️⃣ Последний пример и мой любимый ⭐️ — использовать переменную типа Subject<void>
. Здесь не нужно нажимать или добавлять какие-либо подписки. Вместо этого мы используем оператор takeUntil()
из библиотеки RxJS, но также нам нужно не забыть уничтожить наши подписки в ngOnDestroy()
. Для этого решения см. Код ниже 👇
Большой! 🤩
У нас есть несколько решений, чтобы следить за нашими подписками, чтобы не было утечек памяти, но что, если мы можем сделать лучше?
Что, если нам не нужно помнить об отписке и всегда писать один и тот же код в ngOnDestroy()
, потому что это будет сделано автоматически.
Вы не верите? 👀 Посмотрите пример этого замечательного декоратора недвижимости ниже 👇
Декоратор @AutoDestroy 🔥
Это решение работает только с третьим методом выше. Если вы предпочитаете использовать один из первых двух методов, ничего страшного, просто перепишите этот декоратор, чтобы он выполнял методы, использованные в ngOnDestroy()
.
Полный код декоратора @AutoDestroy
будет выглядеть так:
Если вы хотите использовать этот декоратор в компоненте, вы можете сделать это так:
Итак, как это работает? Это очень просто!
Проверьте это ниже 👇
Как это работает? 🤔
Чтобы использовать декоратор @AutoDestroy
, нам просто нужно добавить его перед нашей переменной destroy$
типа Subject<void>
. Благодаря этому компонент и имя этой переменной будут переданы нашему декоратору. Основная цель этого декоратора — перезаписать метод жизненного цикла ngOnDestroy()
своим собственным. Очень важно проверить, нет ли у этого компонента уже собственного ngOnDestroy()
, потому что без него мы потеряем исходный вызов. Итак, если компонент имеет свой собственный ngOnDestroy()
, мы просто вызываем его здесь, затем уничтожаем наши подписки, и все.
Легко, верно? 😎
Вам больше не нужно помнить об отмене подписки, просто используйте @AutoDestroy
декоратор свойств 🔥.
Подведение итогов
Я надеюсь, что эта статья поможет вам решить проблемы с подписками. Если вы хотите протестировать его, проверьте его на StackBlitz ⚡️ или просмотрите исходный код на Github 🎓.
Если вам понравилось это читать, пожалуйста, хлопните в ладоши 👏 . Не стесняйтесь подписываться на меня и оставлять комментарии с вашими отзывами 👇.