I decided to use Observable instead of Http promises.
That is how my Promise service looked:
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)); } }
First I fetch an array of movies, and than I find a certain movie of the array by id. However when I try to do the same with Observable, I get an error notification on find: Property 'find' does not exist on type 'Movie[]'.
Here is what I tried with the Observable service:
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)); } }
How can I achieve the same functionality in my Observable service just like in my Promise service?
Reading information from an observableArray So, you can get the underlying JavaScript array by invoking the observableArray as a function with no parameters, just like any other observable. Then you can read information from that underlying array. For example, alert( 'The length of the array is ' + myObservableArray().
The RxJS isEmpty() operator returns an observable with a Boolean value indicating whether the observable was empty or not. It returns an output as true if the source observable is empty; otherwise, false.
Angular makes use of observables as an interface to handle a variety of common asynchronous operations. For example: The HTTP module uses observables to handle AJAX requests and responses. The Router and Forms modules use observables to listen for and respond to user-input events.
I suppose you should use map
method instead of subscribe
which returns Subscription
object
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With