2017-02-28 2 views
1

Ich habe eine Route in Angular, wo ich eine id übergeben, um ein Element aus meiner Datenbank zu laden. In meiner Komponente lade ich das Element mit dem folgenden Code:Angular 2 Router Parameter geben mehrere http Anrufe

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(['/'])); 

Wo this.service.getElement(id) einen HTTP-Aufruf macht und gibt einen beobachtbaren. Es geht alles gut. Das Problem, das ich jetzt habe, ist, dass ich einen zweiten http-Anruf ausgeben möchte und ich nicht weiß, wo der Code für den zweiten Dienst-http-Aufruf hinzugefügt werden muss (es wäre eine ähnliche Methode wie getElement, ein id als Parameter empfangen).

Weitere Informationen: Der zweite http-Aufruf würde idealerweise parallel zum getElement Aufruf ausgegeben werden. Es kommt nur auf die id aus der Params.

Wie kann ich das mit Observables machen? Gibt es eine Möglichkeit, es zum Laufen zu bringen?

+0

Wo möchten Sie diesen zweiten Anruf tätigen? Worauf basiert es? Auf vorherige Antwort? die Route params id? Geben Sie weitere Informationen bitte – Maxime

+0

Es basiert nur auf der ID. Idealerweise würde es parallel zum getElement-Aufruf ausgegeben werden. –

+2

Ich habe momentan keine Zeit, Ihnen eine Lösung zu geben, aber werfen Sie einen Blick in [Fork Join] (http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method (forkJoin), es ist das Äquivalent von 'Promise.all'. Es wird alle Observables abonnieren, die du passierst, und wartet dann darauf, dass jeder von ihnen beendet wird, bevor er fortfährt. Natürlich werden sie parallel gestartet. Ich lasse dich etwas probieren und später wenn es nicht gelingt werde ich helfen :) – Maxime

Antwort

1

Mit @ Maxime Kommentar ich mit dem folgenden Code kam:

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(['/'])); 

Das startet beide Anrufe gleichzeitig und wartet auf Fertigstellung von beiden.