Forklar hvordan netværkskommunikation skal bruges jf. Angulars best practice med en HttpClientModule)
Reactive Programming er et programmeringsparadigme, der arbejder med asynkrone datastrømme. Det er fordelagtigt da vi arbejder med netværksprotokolmer som er asynkrone. Med Reactive Extensions for JavaScript (RxJS) kan vi bruge observables, som er datastrømme, der udsender værdier over tid. RxJS er ideelt til at håndtere asynkrone operationer, såsom API-kald og brugerinteraktioner(events), fordi det reducerer kompleksiteten af at arbejde med samtidige og dynamiske hændelser.
En observable repræsenterer en strøm af data, der kan udsende flere værdier over tid.
Konvention: Variabler, der er observables, navngives ofte med $ som suffix.
Eksempel fra handin:
src/app/services/credit-card.service.tsgetCards() returnerer en observable, der henter data fra en backend:
getCards(): Observable<CreditCard[]> {
return this.http.get<CreditCard[]>(`${this.baseUrl}/cards`);
}
En subscription forbinder en observer med en observable. Dette initierer datastrømmen. Subscriptionen kan bruges til at afbryde forbindelsen og forhindre hukommelseslækager.
Eksempel fra handIn:
src/app/card-details/card-details.component.tsgetTransactions() for at hente transaktioner:
this.creditCardService.getTransactions(cardNumber).subscribe({
next: (transactions) => this.transactions = transactions,
error: (err) => console.error(err),
});
Operators er funktioner, der manipulerer datastrømme. De bruges enten til at oprette nye observables (creation operators) eller ændre eksisterende (pipeable operators).
map til at fordoble værdierne i en liste:
const array = [10, 20, 30];
const result = from(array).pipe(map(x => x * 2));
result.subscribe(x => console.log(x)); // Logs: 20, 40, 60
I projektet kunne map bruges til at formatere transaktioner, før de præsenteres.
Angulars HttpClientModule er et kraftfuldt værktøj til at håndtere HTTP-anmodninger. Det fungerer som et wrapper-lag omkring browserens XMLHttpRequest-API og gør det nemt at udføre asynkrone operationer.
For at bruge HttpClient, skal HttpClientModule importeres i AppModule.
Eksempel:
src/app/app.module.tsimport { HttpClientModule } from '@angular/common/http';
@NgModule({
imports: [HttpClientModule]
})
HttpClient kan injiceres i services for at centralisere al API-logik.
Eksempel:
src/app/services/credit-card.service.tsprivate http = inject(HttpClient);
Alle HTTP-anmodninger returnerer observables. Dette gør det muligt at anvende RxJS operators som map, filter og catchError.
Eksempel:
src/app/card-details/card-details.component.tsgetTransactions() returnerer data som observable:
this.creditCardService.getTransactions(cardNumber).pipe(
map(transactions => transactions.filter(t => t.amount > 0))
).subscribe(filteredTransactions => this.transactions = filteredTransactions);
En interceptor er en service, der interagerer med HTTP-anmodninger og -svar. Det bruges til at tilføje fælles logik som autorisationstokens eller fejlhåndtering.
Eksempel:
src/app/interceptor.tsintercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const cloned = req.clone({ headers: req.headers.set('Authorization', 'Bearer TOKEN') });
return next.handle(cloned);
}
Fejl kan håndteres med RxJS-operatoren catchError. Dette sikrer, at brugeren ikke ser en brudt applikation, hvis der opstår fejl.
Eksempel:
src/app/card-details/card-details.component.tsthis.creditCardService.getTransactions(cardNumber).pipe(
catchError(err => {
console.error('Fejl ved hentning:', err);
return of([]); // Returner en tom liste som fallback
})
).subscribe();