@fivexlabs/ng-terminus
Version:
A comprehensive Angular library for managing RxJS subscriptions and preventing memory leaks with advanced features
144 lines (123 loc) • 4.25 kB
text/typescript
/**
* Basic Usage Examples for ng-terminus
*
* These examples demonstrate how to use the ng-terminus library
* for automatic subscription management in Angular applications.
*/
import { Component, OnInit, inject, DestroyRef } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { interval, map, filter } from 'rxjs';
import {
takeUntilDestroyed,
SubscriptionManager,
createManagedObservable,
manageManyObservables
} from '@fivexlabs/ng-terminus';
// Example 1: Basic takeUntilDestroyed usage
({
selector: 'app-basic-example',
template: `<div>Basic Example Component</div>`
})
export class BasicExampleComponent {
constructor(private http: HttpClient) {
// This subscription will automatically unsubscribe when component is destroyed
this.http.get('/api/data')
.pipe(takeUntilDestroyed())
.subscribe(data => console.log('Data received:', data));
}
}
// Example 2: Using SubscriptionManager
({
selector: 'app-subscription-manager-example',
template: `<div>Subscription Manager Example</div>`,
providers: [SubscriptionManager] // Provide at component level
})
export class SubscriptionManagerExampleComponent implements OnInit {
constructor(
private http: HttpClient,
private subManager: SubscriptionManager
) {}
ngOnInit() {
// Add multiple subscriptions that will be cleaned up automatically
this.subManager.add(
// HTTP request subscription
this.http.get('/api/users').subscribe(users => console.log('Users:', users)),
// Interval subscription
interval(1000).subscribe(tick => console.log('Tick:', tick)),
// Complex observable chain
interval(5000).pipe(
map(x => x * 2),
filter(x => x % 4 === 0)
).subscribe(value => console.log('Filtered value:', value))
);
console.log(`Managing ${this.subManager.activeCount} subscriptions`);
}
// No ngOnDestroy needed! SubscriptionManager handles cleanup
}
// Example 3: Advanced usage with explicit DestroyRef
({
selector: 'app-advanced-example',
template: `<div>Advanced Example Component</div>`
})
export class AdvancedExampleComponent {
private destroyRef = inject(DestroyRef);
constructor(private http: HttpClient) {
// Using explicit DestroyRef
this.http.get('/api/config')
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(config => this.applyConfig(config));
// Using utility functions
const managedData$ = createManagedObservable(
this.http.get('/api/data'),
this.destroyRef
);
managedData$.subscribe(data => console.log('Managed data:', data));
// Managing multiple observables
const [stream1$, stream2$, stream3$] = manageManyObservables([
this.http.get('/api/stream1'),
this.http.get('/api/stream2'),
this.http.get('/api/stream3')
], this.destroyRef);
stream1$.subscribe(data => console.log('Stream 1:', data));
stream2$.subscribe(data => console.log('Stream 2:', data));
stream3$.subscribe(data => console.log('Stream 3:', data));
}
private applyConfig(config: any) {
console.log('Applying configuration:', config);
}
}
// Example 4: Service usage
import { Injectable } from '@angular/core';
()
export class DataService {
private destroyRef = inject(DestroyRef);
constructor(private http: HttpClient) {
// Services can also use takeUntilDestroyed
interval(10000)
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => this.refreshData());
}
private refreshData() {
console.log('Refreshing data...');
}
getData() {
return this.http.get('/api/data')
.pipe(takeUntilDestroyed(this.destroyRef));
}
}
// Example 5: Combining with other RxJS operators
({
selector: 'app-rxjs-example',
template: `<div>RxJS Operators Example</div>`
})
export class RxJSExampleComponent {
constructor(private http: HttpClient) {
this.http.get('/api/search')
.pipe(
map(response => response.data),
filter(data => data.length > 0),
takeUntilDestroyed() // Always use as the last operator
)
.subscribe(data => console.log('Filtered data:', data));
}
}