We covered this in our newsletter before: Observables can cause memory leaks if we don’t unsubscribe from them.

Before Angular 16, there were a few different techniques available to unsubscribe automatically, the best of those being the async
pipe (and yes, it’s possible to use the async
pipe 100% of the time if you use the tricks highlighted here – no excuses).
With Angular 16, things are even better, as you can use the new takeUntilDestroyed
operator as follows:

But here’s my million-dollar tip for today: Instead of using takeUntilDestroyed
in your components, use it in the services that expose such Observables:

That way, whether you use an async
pipe or not, your components are covered. That’s one of the nice things about Observables: We can change them whenever and wherever we want using pipe()
, including in our services – so that all subscribers benefit from that change downstream.