2016-11-08 10 views
7

Postanowiłem użyć Observable zamiast obietnic Http.Jak znaleźć element tablicy przez id z Obserwowalne w Angular2

To jest jak mój serwis obietnica wyglądało:

export class MovieService { 

    movies: Movie[] 
    movie: Movie; 
    constructor(private http:Http) { } 

    getMovies(): Promise<Movie[]>{ 

     return this.http.get('http://api.request.com') 
      .toPromise() 
      .then((res:Response) => res.json()['results']) 

    } 
    getMovie(id: number): Promise<Movie> { 
     return this.getMovies() 
      .then(movies => movies.find(movie => movie.id == id)); 

    } 

} 

Najpierw pobrać tablicę filmów i niż ja znaleźć pewien film tablicy przez ID. Jednak gdy spróbuję zrobić to samo z Observable, otrzymuję powiadomienie o błędzie w sprawie find: Właściwość "find" nie istnieje w typie "Movie []".

Oto co próbowałem z usługą obserwowalnych:

export class MovieService { 

    movies: Movie[]; 
    movie: Movie; 

    constructor(private http: Http) { 
    } 

    getMovies(): Observable<Movie[]> { 

     return this.http.get('http://api.request.com) 
      .map((res: Response) => res.json()['results']); 
    } 

    getMovie(id: number): Observable<Movie> { 
     return this.getMovies() 
      .subscribe(movies => movies.find(movie => movie.id == id)); 
    } 
} 

jaki sposób można osiągnąć tę samą funkcjonalność w moim obserwowalnych usługi podobnie jak w mojej służbie obietnicy?

+1

* właściwość 'Szukaj' nie istnieje w rodzaju „Movie [] * jest błąd typu, ponieważ konfiguracja TS jest nieprawidłowa. Powinien mieć opcję 'lib: ['es6']'. – estus

+0

Masz rację. Zmieniłem to i teraz działa z tym znaleziskiem. Dzięki. – GaborH

Odpowiedz

6

Przypuszczam, należy użyć map metodę zamiast subscribe która zwraca Subscription obiekt

export class MovieService { 
    movies: Movie[]; 
    movie: Movie; 

    constructor(private http: Http) {} 

    getMovies(): Observable<Movie[]> { 
    return this.http.get('http://api.request.com') 
     .map((res: Response) => res.json()['results']); 
    } 

    getMovie(id: number): Observable<Movie> { 
    return this.getMovies() 
     .map(movies => movies.find(movie => movie.id == id)); 
    } 
} 

Plunker Example

+0

Pomyślałem również o tym, ponieważ muszę subskrybować, kiedy nazywam tę funkcję z innego komponentu. Jednak daje ten sam błąd w mapie. – GaborH

+0

Jak tego używasz? – yurzui

+0

Byłoby pomocne, gdyby można było opublikować błąd i/lub ślad stosu. – Siri0S

Powiązane problemy