RxJS.takeUntil – Stepan Suvorov Blog https://stepansuvorov.com/blog Release 2.0 Sat, 03 Jun 2017 21:45:30 +0000 en-US hourly 1 https://wordpress.org/?v=6.3.1 Angular & Rxjs: Отписываться или не отписываться? https://stepansuvorov.com/blog/2017/06/angular-rxjs-unsubscribe-or-not-unsubscribe/ https://stepansuvorov.com/blog/2017/06/angular-rxjs-unsubscribe-or-not-unsubscribe/#comments Sat, 03 Jun 2017 21:45:02 +0000 http://stepansuvorov.com/blog/?p=3361 Continue reading ]]> Как вы наверное уже знаете при подписке на обозреваемую последовательность либо просто событие в Javascript вы обычно должны в определенный момент отписываться, чтобы освободить память. Иначе это приведет к утечке памяти.

Мы рассмотрим основные случаи, когда вы должны отписываться в ngOnDestroy хуке компонента, а также случаи, когда можно не отписываться.

Нужно отписываться

Формы

необходимо отписываться от формы и от отдельных формконтролов, на которые подписались:

View the code on Gist.

Роутер

Согласно официальной документации Angular должен сам отписывать вас, но этого не происходит, поэтому:

View the code on Gist.

Рендерер

View the code on Gist.

Бесконечные обозреваемые последовательности

Примерами бесконечных могут служить последовательности созданные с помощью interva() или слушающие события (fromEvent()):

View the code on Gist.

ngRx

От подписок на состояние Store ngRx тоже необходимо отписываться:

View the code on Gist.

 

Отписываться НЕ нужно

Async pipe

C async pipe нам повезло и он выполнят работу под отписке за нас:

View the code on Gist.

@HostListener

так же нам не нужно отписываться, когда мы навешиваем слушатель события с помощью HostListener:

View the code on Gist.

Конечные обозреваемые последовательности

Бывают последовательности, которые сами завершаются, такие как HTTP и timer:

View the code on Gist.

Bonus

Также вы можете использовать оператор takeUntil, который позволит писать код в декларативном стиле, не отписываясь от каждого обозревателя отдельно:

View the code on Gist.

Кроме takeUntil вы еще можете использовать taketakeWhile и first которые также позволят “убить” последовательность, соотвественно не прийдется от нее отписываться.

 

Большая часть материала взята из статьи When to Unsubscribe in Angular.

 

 

]]>
https://stepansuvorov.com/blog/2017/06/angular-rxjs-unsubscribe-or-not-unsubscribe/feed/ 7