Все шаблоны, которые вам когда-либо понадобятся для подписки и отказа от подписки на RxJS Observables в вашем проекте Angular!
Следите за кодом с помощью этой живой демонстрации
Найдите полный исходный код этого блога в этом репозитории github
Вступление
Мы используем RxJS в каждом приложении Angular, которое мы пишем, он оказывает большое влияние на поток данных в нашем приложении, производительность и многое другое.
Важно отказаться от подписки на наши Observables, чтобы избежать утечек памяти. Эта статья покажет вам большинство шаблонов, от которых вы можете отказаться от подписки на Observables в своих компонентах Angular!
Мы начинаем с создания этой фиктивной службы, чтобы отслеживать создаваемые нами подписки.
Наша фиктивная служба будет иметь единственный getEmissions
метод, который принимает scope
для регистрации событий и возвращает Observable, который выдает ${scope} Emission #n
каждую n-ю секунду.
№1 «Обычный» способ
Самый простой способ подписаться и отказаться от подписки на Observable - это подписаться в ngOnInit
, создать свойство класса, содержащее наш Subscription
, и отказаться от подписки в ngOnDestroy
.
Чтобы упростить задачу, мы можем инициализировать свойство подписки на Subscription.EMPTY
, чтобы избежать проверки на null это при отказе от подписки:
Чтобы убедиться, что все работает, мы удалим компонент из DOM через 3 секунды, чтобы убедиться, что он отписывается.
Как следует из названия, это самый простой способ отказа от подписки, он хорош, когда у вас есть одна подписка, но когда у вас несколько подписок, для каждой из них потребуется собственное свойство класса и вызов до unsubscribe
в пределах ngOnDestroy
# 2 метод Subscription.add
Подписка RxJS поставляется со встроенным Subscription.add
методом, который позволяет нам объединить несколько логик разрыва в один экземпляр подписки.
Сначала создайте свойство класса, инициализированное значением new Subscription()
, затем, вместо того, чтобы назначать наши подписки свойствам класса, вызовите Subscription.add
метод < br /> И напоследок отпишусь в ngOnDestroy
Открыв нашу консоль, мы должны увидеть две подписки:
Благодаря этому мы можем легко использовать встроенную мощь RxJS и подписаться / отказаться от подписки на несколько Observable, не вводя дополнительных свойств класса.
# 3 AsyncPipe
Angular имеет много отличных встроенных каналов, один из них - AsyncPipe.
AsyncPipe принимает Observable, автоматически подписывается на него и отменяет подписку при уничтожении компонента.
В отличие от предыдущих примеров, здесь мы не подписываются на наш компонент, но передают Observable в AsyncPipe:
На мой взгляд, это один из самых чистых способов использования Observables в Angular.
Все, что вам нужно, это создать Observables и позволить Angular подписаться и отказаться от подписки за вас.
# 4 Оператор takeUntil
RxJS содержит множество полезных операторов, takeUntil
- один из них.
Согласно его сигнатуре, takeUntil принимает notifier
, который после отправки отписывается от источника Observable.
В нашем случае мы хотели бы уведомить Observable, когда компонент уничтожен, для этого мы добавляем свойство класса с именем componentDestroyed$
(или любое другое имя, которое вы хотите) типа Subject<void>
и используем его в качестве уведомителя.
Все осталось уведомить в ngOnDestroy
, наш окончательный код будет:
В отличие от предыдущего «обычного» способа, этот шаблон не вводит дополнительных свойств класса с несколькими подписками. Все, что нам нужно сделать, это добавить takeUntil(componentDestroyed$)
, а RxJS позаботится обо всем остальном.
# 5 Библиотека SubSink
SubSink - отличная библиотека от Ward Bell, она позволяет вам изящно отказаться от подписки на Observables в вашем компоненте.
Сначала установите SubSink, запустивnpm i subsink
или yarn add subsink
Затем мы создадим свойство класса типа SubSink.
SubSink бывает двух видов: Easy Technique (с использованием установщика) и Массив / Техника добавления.
Использовать Easy Technique так же просто, как использовать метод установки sink
.
Использование Array / Add Technique имеет тот же синтаксис, что и исходный RxJS _23 _.
Создавая подписку на каждый из методов, наш компонент будет выглядеть так
# 6 до уничтожения библиотеки
Примечание: эта библиотека работает по-другому в Pre Ivy Angular, для получения дополнительной информации посетите docs
Until-destroy - одна из многих замечательных библиотек от ngneat, она использует декоратор UntilDestroy, чтобы определять, какие свойства являются подписками, и автоматически отменять подписку при уничтожении компонента.
Мы также можем использовать его собственный оператор RxJS с именем untilDestroyed
вместо использования свойств класса.
Чтобы использовать его, нам нужно только применить декоратор UntilDestroy к нашему компоненту и добавить оператор untilDestroyed
в канал Observables:
В заключение, until-destroy - очень мощная библиотека, которая позволяет вам автоматически подписываться / отказываться от подписки на Observables.
Кроме того, until-destroy имеет много функций, которые не описаны в этой статье, поэтому не стесняйтесь и отправляйтесь в их репозиторий на github!
Резюме
Мы видели множество способов и шаблонов для подписки и отказа от подписки на наши Observables, каждый из которых имеет свои плюсы и минусы и привносит в таблицу свой стиль кодирования.
Самое главное, какой бы шаблон вы ни выбрали, будьте последовательны.