Estoy trabajando en aprender Angular 2 y Typescript. Estoy creando una aplicación web simple que toma datos de una API WEB y los muestra en una lista. Luego, una vez que el usuario hace clic en un elemento de la lista, se le lleva a una página de detalles.
Tengo un servicio que creé para hacer la llamada a la API que hace lo siguiente:
GetData() { let data = this.http.get('http://server.name/api/GetData') .map((res) => res.json()); return data; }Luego, en un componente, me suscribo a los datos como este:
this.myService.GetData() .subscribe((myService) => this.items = myService);Cuando regrese http.get, me gustaría realizar algún procesamiento en los objetos JSON antes de regresar del método GetData(). Por ejemplo, agregue una nueva propiedad llamada ID. Esencialmente algo como el pseudocódigo a continuación:
for each(item in data) { item.ID = newID(); //method for creating IDs }Gracias
Puede hacer el procesamiento en el código de su GetData, dentro del map :
// For RxJS v5 this.http .get('http://server.name/api/GetData') .map(result => { const items = <any[]>result.json(); // could be SomeItem[] instead of any[] items.forEach(item => item.ID = ...); return items; }); // For RxJS v6 this.http .get('http://server.name/api/GetData') .pipe(map(result => { const items = <any[]>result.json(); // could be SomeItem[] instead of any[] items.forEach(item => item.ID = ...); return items; }));Luego, cuando reciba el objeto en su suscripción, los elementos deben tener las identificaciones asignadas.
Aquí está la referencia a la documentación de RxJs Observable: http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-map
la idea es:
el operador mergeMap (reemplazado flatMap en rxjs 5.5+) se usa porque un operador Observable siempre devuelve un Observable, pero dado que creamos un Observable dentro del resultado mismo, produce un Observable>, mergeMap elimina una capa Observable. Espero que esto ayude
GetData():Observable<WhateverWithIDInside[]> { let data = this.http.get('http://server.name/api/GetData') .map(res => res.json()) .mergeMap(dataArr => Observable.from(dataArr) .map(data => { data.ID = newID(); return data; }) .toArray() ); }