Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

178
Views
Relaciones 1: N o N: 1 de dos objetos en Angular2 como observables de una solicitud http

Refiriéndose al " Tour de los héroes " del tutorial angular.

Asumimos que le daremos a todos los héroes existentes la posibilidad de usar una suite especial, pero cualquier otro héroe también puede usar la misma suite. Realmente no queremos que estén desnudos. En este caso, tendríamos un objeto de datos relacionado que contiene toda la información sobre los trajes disponibles. El propio héroe tiene que saber qué traje lleva puesto y dónde puede encontrar el elegido. Para este caso, crearíamos una propiedad que contenga la identificación de su vestido elegido.

¿Cuál sería la forma correcta de resolver la relación entre el héroe y su suite en Angular como se puede observar desde la solicitud http?

P.ej:

app/hero.ts

 export class Hero { id: number; name: string; suiteId: number; }

app/suit.ts

 export class Suite { id: number; name: string; material: string; color: string; }

app/in-memory-data.service.ts

 import { InMemoryDbService } from 'angular-in-memory-web-api'; export class InMemoryDataService implements InMemoryDbService { createDb() { let heroes = [ {id: 11, name: 'Mr. Nice', suitId: 11}, {id: 12, name: 'Narco', suitId: 12} ]; let suits= [ {id: 11, name: 'Nice and blue', material: 'Cotton', color: 'blue'}, {id: 12, name: 'Sexy and red', material: 'Silk', color: 'red'} ]; return {heroes, suits}; } }

Sé que algo como el siguiente bloque de código funcionará, pero me gustaría saber cómo resolver esto de la manera "observable".

 // ... getHeroesWithSuit(): Observable<Hero[]> { return this.http.get(this.heroesUrl) .map( response => response.json().data as Hero[]) .do( response => response.forEach( ( data ) => data.suite = this.suiteService .getSuit(data.suiteId) .subscribe(suite => data.suite = suite as Suite) )) .catch(this.handleError); } // ...
about 4 years ago · Santiago Trujillo
1 answers
Answer question

0

el método getHeroesWithSuit() realiza dos tareas.

  1. obtener la lista de héroes.
  2. obtener detalles de la suite para cada héroe.

Y como queremos combinar estas dos operaciones, necesitamos usar los operadores flatMap y forkJoin . Usando estos dos operadores, la función getHeroesWithSuit() se puede escribir de manera Observable como esta.

 getHeroesWithSuit(): Observable<Hero[]> { return this.http.get(this.heroesUrl) .map(response => response.json().data as Hero[]) .flatMap((heroes: Heroes[]) => Observable.forkJoin(heroes.map((hero: Hero) => { return this.suiteService.getSuit(hero.suiteId) .map((suite: Suite) => { hero.suite = suite; return hero; }); })) ); }

flatMap Operator le permite encadenar dos Observables, devolviendo un nuevo Observable. aquí estamos encadenando el resultado del servicio de recuperación de héroes al observable forkJoined.

Y luego asignamos cada héroe al método getSuite() de suiteServices y pasamos el resultado al operador forkJoin .

el fragmento de código anterior representa la relación N: 1 donde cada héroe tiene una suite.

pero ¿qué pasa si cada héroe tiene varias suites y el campo suiteId de la clase Hero es una matriz? En ese caso, tenemos que usar el operador forkJoin una vez más para recuperar la información de todas las suites para cada héroe.

En este forkJoin todos los suiteId de suite de cada héroe al método getSuit() de suiteServices . Y esta será la relación 1:N entre objetos. La función de actualización getHeroesWithSuit() se verá así.

 getHeroesWithSuit():Observable<Hero[]> { return this.http.get(this.heroesUrl) .map(response => response.json().data as Hero[]) .flatMap( (heroes:Heroes[]) => Observable.forkJoin(heroes.map( (hero:Hero) => { return Observable.forkJoin(hero.suiteIds.map( suiteId => { return this.suiteService.getSuit(suiteId) } )).map( suites => { hero.suites = suites; return hero; }) } )) ); }

aquí está el enlace de referencia que tiene una buena explicación de los operadores y cómo usarlos para combinar múltiples Observables. Espero que esto sea de ayuda.

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!