array angular2 http angular rxjs

http - angular2 - return observable angular 4



Angular2: convierte la matriz a Observable (7)

Algunas personas como yo lo quieren de manera diferente, que es desde la 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 otros.

Tengo un componente que obtiene los datos de un servicio a través de http, el problema es que no quiero llegar 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 es así, devuelve un observable con la matriz en la memoria y, si no, realiza 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''); } }


En angular7 es suficiente para poner el of() . Lo que ponga dentro of() se cambiará a observable. Aquí, this.contacts se convierte en observable.

import { of } from ''rxjs''; getContacts() { if(this.contacts != null) { return of(this.contacts); } }


Estás ahí. Si ya tiene los datos en la memoria, puede usar observables (equivalente a 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); } }


Esto podría llegar muy tarde, pero he estado usando sessionStorage bastante para manejar parte de mi trabajo. Si pierde el estado porque la gente estaba rebotando, todavía tiene sus datos.

getSubjects(): Observable<Subject[]> { let SubjectsString = sessionStorage.getItem("Subjects") if (SubjectsString) { let subjects: Subject[] = JSON.parse(SubjectsString); console.log("GETTING DATA FROM SESSION STORAGE") return Observable.of(subjects); } else { let url = `${this.apiHost}/api/subject`; return this.http.get(url) .map(res =>{ sessionStorage.setItem("Subjects",JSON.stringify(res.json())); return res.json(); }) } }

En este ejemplo, tengo una clase para Asunto y una definición para apiHost, pero el resto es bastante simple. Llamas al servicio para un observable. Su componente no tiene idea de dónde están los datos y no le importa. El servicio verifica el almacenamiento local y, si lo tiene, lo convierte en un observable y lo devuelve, si no lo hace, va y lo obtiene, luego lo guarda en el almacenamiento local y luego lo devuelve.

En mi caso, tengo algunas aplicaciones enormes con cientos de páginas. Los usuarios pueden pasar de una bonita página nueva de Angular4 a una era ASP clásica y volver varias veces. Tener todos los elementos del menú e incluso los resultados de búsqueda en el almacenamiento de sesiones ha sido un salvavidas.


Solución rápida aquí:

getSomething():Observable<Object[]>{ return new Observable(observable => { this.http.get(''example.com'').subscribe(results => { observable.next(results.json()); observable.complete(); }); }); }


También puede usar Observable.of(resultArray);

de la import { Observable } from ''rxjs;'' paquete


import { of } from ''rxjs''; return of(this.contacts);