1 import { Injectable } from '@angular/core';
2 import { Observable, of, EMPTY } from 'rxjs';
3 import { Hero } from './hero';
4 import { HEROES } from './mock-heroes';
5 import { HttpClient, HttpHeaders } from '@angular/common/http';
6 import { MessageService } from './message.service';
7 import { catchError } from 'rxjs/operators';
13 export class HeroService {
15 private heroesUrl = 'api/heroes'; // URL to web api
18 private http: HttpClient,
19 private messageService: MessageService) { }
21 getHeroes(): Observable<Hero[]> {
22 this.log('fetching heroes...');
24 .get<Hero[]>(this.heroesUrl)
26 catchError(this.handleError<Hero[]>('getHeroes', []))
30 getHero(id: number): Observable<Hero> {
31 this.log(`requested hero id=${id}`);
32 const found: Hero | undefined = HEROES.find(hero => hero.id === id);
33 if (found === undefined) {
41 * Handle Http operation that failed.
42 * Let the app continue.
43 * @param operation - name of the operation that failed
44 * @param result - optional value to return as the observable result
46 private handleError<T>(operation = 'operation', result?: T) {
47 return (error: any): Observable<T> => {
49 // TODO: send the error to remote logging infrastructure
50 console.error(error); // log to console instead
52 // TODO: better job of transforming error for user consumption
53 this.log(`${operation} failed: ${error.message}`);
55 // Let the app keep running by returning an empty result.
56 return of(result as T);
60 /** Log a HeroService message with the MessageService */
61 private log(message: string) {
62 this.messageService.add(`HeroService: ${message}`);