2017-02-28 1 views
1

J'ai une route dans Angular où je passe un id pour charger un élément de ma base de données. Dans mon composant je charge l'élément en utilisant le code suivant:Les paramètres du routeur angulaire 2 émettent plusieurs appels http

this.route.params 
     .map((params: Params) => params['id']) 
     .switchMap((id: number) => this.service.getElement(id)) 
     .catch((e) => { 
      return Observable.throw(e); 
     }) 
     .subscribe((data: Models.IElement) => { 
      this.element= data as Models.IElement; 
      this.setTitle(); 
     },() => this.router.navigate(['/'])); 

this.service.getElement(id) fait un appel http et retourne un Observable. Tout va bien. Le problème que j'ai maintenant est que je veux émettre un deuxième appel http et je ne sais pas où ajouter le code pour le deuxième appel http du service (ce serait une méthode similaire à getElement, en recevant un id comme paramètre).

Plus d'informations: Le deuxième appel http devrait idéalement être émis en parallèle à l'appel getElement. Cela dépend seulement du id du Params.

Comment puis-je faire ce travail en utilisant Observables? Y a-t-il un moyen de le faire fonctionner?

+0

Où souhaitez-vous effectuer ce second appel? Sur quoi est-il basé? Sur la réponse précédente? les paramètres de route id? Donner plus d'informations s'il vous plaît – Maxime

+0

C'est seulement basé sur l'ID. Idéalement, il serait émis en parallèle à l'appel getElement. –

+2

Je n'ai pas le temps de vous donner une solution pour l'instant, mais jetez un oeil à [Fork Join] (http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method -forkJoin), c'est l'équivalent de 'Promise.all'. Il s'abonnera à tous les Observables que vous passerez, puis attendra que chacun d'eux se termine avant de continuer. Bien sûr, ils sont lancés en parallèle. Je vous laisse essayer quelque chose et plus tard si vous n'y arrivez pas, je vais vous aider :) – Maxime

Répondre

1

Utiliser @ commentaire de Maxime Je suis venu avec le code suivant:

this.route.params 
     .map((params: Params) => params['id']) 
     .switchMap((id: number) => { 
      this.id = id; 
      return Observable.forkJoin([this.service.getElem(id), this.service.getElemDocs(id)]); 
     }) 
     .catch((e) => { 
      return Observable.throw(e); 
     }) 
     .subscribe(([elem, documents]) => { 
      this.elem= elemas Models.IElement; 
      this.elemDocuments = documents; 
      this.setTitle(); 
     },() => this.router.navigate(['/'])); 

Cette lance deux appels en même temps et attend completition des deux.