Tengo un componente que obtiene los datos de un servicio a través de http, el problema es que no quiero acceder al backend de la API cada vez que muestro este componente. Quiero que mi servicio verifique si los datos están en la memoria, si lo están, devuelva un observable con la matriz en la memoria y, de lo contrario, realice la solicitud http.
mi componente
import {Component, OnInit } from 'angular2/core'; import {Router} from 'angular2/router'; import {Contact} from './contact'; import {ContactService} from './contact.service'; @Component({ selector: 'contacts', templateUrl: 'app/contacts/contacts.component.html' }) export class ContactsComponent implements OnInit { contacts: Contact[]; errorMessage: string; constructor( private router: Router, private contactService: ContactService) { } ngOnInit() { this.getContacts(); } getContacts() { this.contactService.getContacts() .subscribe( contacts => this.contacts = contacts, error => this.errorMessage = <any>error ); } }mi servicio
import {Injectable} from 'angular2/core'; import {Http, Response, Headers, RequestOptions} from 'angular2/http'; import {Contact} from './contact'; import {Observable} from 'rxjs/Observable'; @Injectable() export class ContactService { private contacts: Array<Contact> = null; constructor (private http: Http) { } getContacts() { // Check first if contacts == null // if not, return Observable(this.contacts)? <-- How to? return this.http.get(url) .map(res => <Contact[]> res.json()) .do(contacts => { this.contacts = contacts; console.log(contacts); }) // eyeball results in the console .catch(this.handleError); } private handleError (error: Response) { // in a real world app, we may send the server to some remote logging infrastructure // instead of just logging it to the console console.error(error); return Observable.throw(error.json().error || 'Server error'); } }Estás ahí. Si ya tiene los datos en la memoria, puede usar observable (equivalente of return/just en RxJS 4).
getContacts() { if(this.contacts != null) { return Observable.of(this.contacts); } else { return this.http.get(url) .map(res => <Contact[]> res.json()) .do(contacts => this.contacts = contacts) .catch(this.handleError); } }import { of } from 'rxjs'; return of(this.contacts);Algunas personas como yo lo quieren de manera diferente, que es de string[] a Observable<string> .
Este es un ejemplo que implica la conversión:
import { from } from 'rxjs/observable/from'; import 'rxjs/add/operator/map'; import 'rxjs/add/operator/toArray'; const ids = ['x12', 'y81']; let userUrls: string[]; from(ids) // Converting string[] into Observable<string> .map(id => 'http://localhost:8080/users/' + id) .toArray() .subscribe(urls => userUrls = urls);Esperemos que ayude a algunos otros.