2016-10-28 5 views
-1

Ich habe folgendes Service in Angular2:Wert auf eine interne Variable in einer Funktion angular2 Weisen

@Injectable() 
export class MyService{ 

    private myServiceUrl= .... 

    constructor(private http: Http) { } 

    getService(): Promise<MyObject> { 
     return this.http.get(this.myServiceUrl).map(response => response.json()) 
      .toPromise(); 
    }  
} 

Und ich habe diese Funktion in einer meiner Komponenten:

myFunction(): any{ 
    let toReturn: any; 
    this.myService.getService().then(result => toReturn = result); 
    console.log(toReturn); 
    return toReturn; 
    } 

Grundsätzlich als Sie können sehen, ich möchte in toReturn die Objekte speichern, die es durch das Versprechen von myService zurückgegeben wird. Ich schaue auf den Rest Anruf, den ich habe, und ich bekomme den richtigen JSON, aber wenn ich versuche, es in der internen Variable zu speichern, werde ich in toReturn undefiniert.

Allerdings, wenn ich versuche, dies:

this.myService.getService().then(result=> console.log(result)); 

Ich kann den json Ich möchte sehen.

Ich kann eine Funktion wie folgt tun:

getService(address: string) { 
     this.myService.getService().then(result=> this.result= result); 
} 

Aber ich ziehe meine Funktion zurückzukehren, ein Objekt zu machen. Was mache ich falsch? Denken Sie daran,

Antwort

2

dass getService asynchron ist, so dass, wenn Ihr Code der Zeile

return toReturn; 

Die toReturn Variable nicht erhalten haben, erreicht noch die Daten vom Server.

Der sauberste Weg, damit umzugehen, ist das Versprechen selbst zurückzukehren, so dass der anrufende Code die Daten extrahieren, wenn sie vom Server ankommt: auf diese Weise

myFunction(): Promise<MyObject> 
{ 
    //return the promise that will output data in the future 
    return this.myService.getService(); 
} 

Der Aufrufcode auf die Daten zugreifen können :

myFunction().then(result => 
    this.result= result 
) 

können Sie auch durch das loswerden von myFunction einen Schritt entfernt werden, da es sich um getService() nur eine dünne Hülle ist. Stattdessen kann der aufrufende Code einfach tun:

this.myService.getService().then(result => this.result = result) 

Und das ist es.

Sie müssen verstehen, zwei Konzepte über asynchrone ops und verspricht:

Addendum Ihre Kommentare Adresse

  1. Ein Versprechen in einem anderen Thread ausgeführt wird, so die Linien nach dem Anruf an getService() werden ausgeführt vor die Daten ankommen. Deshalb zeigt console.log() Ihnen an diesem Punkt keine Daten. Das ist auch der Grund, warum Sie versuchen, das Ergebnis dort nicht zu senden

  2. der einzige Ort im Code, wo Sie das Ergebnis eines Versprechens erfassen können, ist. Then(). Dort können Sie mit dem Ergebnis alles machen, was Sie wollen, einschließlich der Speicherung in einer beliebigen Variablen.Erinnern Sie sich nur an Punkt 1, und erwarten Sie nicht, Zugriff auf das Ergebnis in der nächsten Zeile zu haben, da then() später in einem anderen Thread auftritt.

die json zuweisen, die von diesem Service geht, zu einer internen Variablen (die eine Versprechen zurückgibt), die ich in der Zeile oben definiert ist, es nicht funktioniert. Wie kann es in eine interne Variable gespeichert werden und es

können Sie nicht.

+0

Die AFAIR-Geodcoding-API wird ebenfalls nicht von zone.js abgedeckt und benötigt einen 'zone.run (...)', damit der Code in der Funktion innerhalb der Angulars-Zone ausgeführt werden kann. –

+0

Das Versprechen wird von googleMapGeocodingService zurückgegeben, sodass ich nicht auf das Versprechen zugreife. – Manuelarte

+0

Jungs, vergessen Sie Geocoding, lassen Sie uns einen anderen Namen geben, der Dienst funktioniert ... Was es nicht funktioniert, ist die Zuweisung zu einer internen Variable. Wenn ich geocoding => console.log (geocoding) mache, kann ich den kompletten JSON sehen. – Manuelarte

Verwandte Themen