Unsubscribing stops your app from listening to things it no longer needs. This helps keep your app fast and avoids memory leaks, which slow it down over time.
Unsubscribing and memory leaks in Angular
import { Component, OnDestroy } from '@angular/core'; import { Subscription } from 'rxjs'; @Component({ selector: 'app-example', template: `<p>Example works!</p>` }) export class ExampleComponent implements OnDestroy { private subscription: Subscription; constructor() { this.subscription = someObservable.subscribe(data => { // handle data }); } ngOnDestroy() { this.subscription.unsubscribe(); } }
Always unsubscribe in the ngOnDestroy lifecycle method to avoid memory leaks.
You can store multiple subscriptions in a Subscription object and unsubscribe all at once.
this.subscription = observable.subscribe(value => { console.log(value); }); ngOnDestroy() { this.subscription.unsubscribe(); }
private subscriptions = new Subscription(); this.subscriptions.add(observable1.subscribe()); this.subscriptions.add(observable2.subscribe()); ngOnDestroy() { this.subscriptions.unsubscribe(); }
takeUntil with a Subject to automatically unsubscribe when the component is destroyed.import { takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; private destroy$ = new Subject<void>(); observable.pipe(takeUntil(this.destroy$)).subscribe(); ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); }
This component counts seconds using an Observable timer. It unsubscribes when the component is removed to stop counting and free memory.
import { Component, OnDestroy } from '@angular/core'; import { interval, Subscription } from 'rxjs'; @Component({ selector: 'app-timer', template: `<p>Seconds passed: {{seconds}}</p>` }) export class TimerComponent implements OnDestroy { seconds = 0; private timerSubscription: Subscription; constructor() { const timer$ = interval(1000); // emits every second this.timerSubscription = timer$.subscribe(() => { this.seconds++; }); } ngOnDestroy() { this.timerSubscription.unsubscribe(); } }
Not unsubscribing can cause your app to slow down or crash because it keeps running code you don't need.
Angular's async pipe automatically unsubscribes for you in templates.
Use tools like browser DevTools to check for memory leaks by watching memory usage over time.
Always unsubscribe from Observables to avoid memory leaks.
Use ngOnDestroy to clean up subscriptions when components are removed.
Use helpers like Subscription or takeUntil to manage multiple subscriptions easily.
Practice
Solution
Step 1: Understand Observable subscriptions
Subscriptions keep listening to data streams, even if the component is gone.Step 2: Recognize the effect of not unsubscribing
Not unsubscribing causes memory to be used unnecessarily, leading to leaks.Final Answer:
To prevent memory leaks by stopping ongoing subscriptions when the component is destroyed. -> Option BQuick Check:
Unsubscribe to avoid memory leaks = B [OK]
- Thinking Angular unsubscribes automatically
- Believing unsubscribing improves load speed
- Ignoring memory leaks from active subscriptions
ngOnDestroy method?Solution
Step 1: Recall Subscription API
The Subscription object has anunsubscribe()method to stop listening.Step 2: Identify correct method name
Onlyunsubscribe()is valid; others do not exist on Subscription.Final Answer:
this.subscription.unsubscribe(); -> Option AQuick Check:
Use unsubscribe() to stop subscription = D [OK]
- Using non-existent methods like stop() or cancel()
- Forgetting to call unsubscribe() at all
- Calling unsubscribe() outside ngOnDestroy
export class MyComponent implements OnDestroy {
private sub = this.service.getData().subscribe(data => console.log(data));
ngOnDestroy() {
// missing unsubscribe
}
}What will happen if this component is created and destroyed multiple times without adding unsubscribe in
ngOnDestroy?Solution
Step 1: Analyze missing unsubscribe
Without calling unsubscribe, the subscription stays active even after component destruction.Step 2: Understand consequences
Repeated creation and destruction cause multiple active subscriptions, increasing memory use.Final Answer:
Memory usage will increase over time due to active subscriptions not being cleaned up. -> Option AQuick Check:
Missing unsubscribe causes memory leaks = A [OK]
- Assuming Angular auto-unsubscribes
- Expecting errors on destroy without unsubscribe
- Thinking subscription stops automatically
export class DemoComponent implements OnDestroy {
private subscription: Subscription;
ngOnInit() {
this.subscription = this.service.getData().subscribe();
}
ngOnDestroy() {
this.subscription.unsubscribe;
}
}Solution
Step 1: Check unsubscribe usage
The code usesthis.subscription.unsubscribe;without parentheses, so the method is not executed.Step 2: Understand effect
Without calling unsubscribe(), the subscription remains active, causing memory leaks.Final Answer:
The unsubscribe method is not called; it is referenced without parentheses. -> Option DQuick Check:
Call unsubscribe() with () to execute it = A [OK]
- Forgetting parentheses on unsubscribe
- Assuming referencing method unsubscribes
- Not assigning subscription before unsubscribe
Solution
Step 1: Understand managing multiple subscriptions
Using a Subscription object lets you add multiple subscriptions and unsubscribe all at once.Step 2: Compare with manual unsubscribing
Manual unsubscribing is error-prone and verbose; Subscription.add() simplifies cleanup.Final Answer:
Store all subscriptions in a Subscription object and call unsubscribe() once in ngOnDestroy. -> Option CQuick Check:
Use Subscription.add() and one unsubscribe() call = C [OK]
- Forgetting to unsubscribe all subscriptions
- Relying on Angular to auto-unsubscribe
- Using setTimeout which delays cleanup unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
