2016-05-18 3 views
1
var final; 
final = $http.get('http://localhost:9000/therapist_data',config) 
      .success(function(response) { 
      console.log("I got the data I requested"); 
      var resdata = response; 
      console.log(resdata); 
      return resdata; 
     }); 

console.log(final); 

Ich versuche, Antwortdaten zurückzugeben und speichern sie in endgültige Variable statt ich bekomme das Versprechen-Objekt.
Wie gebe ich die tatsächlichen Daten zurück?

+0

möchten Sie vielleicht einen eigenen Dienst erstellen. –

+0

var final defined –

Antwort

3

Ich werde versuchen, Cyril Antwort basierend auf Ihren Code zu entwickeln:

var final; 
final = $http.get('http://localhost:9000/therapist_data',config) 
     .success(function(response) { 
     console.log("I got the data I requested"); 
     var resdata = response; 
     console.log(resdata); 
     return resdata; 
    }); 

console.log(final); 

Hier ist die Reihenfolge der Ausführung:

  1. var final
  2. $http.get('http://localhost:9000/therapist_data',config) .success();: dies wird die Anfrage auslösen und registrieren die Funktion erfolgreich als Rückruf, wenn der Server auf Ihre Anfrage antwortet
  3. console.log(final); -> so noch undefiniert. Es wartet NICHT auf die Antwort.
  4. einige Male später ... wird Ihre Funktion im Erfolg genannt.

Dies ist die Basis von Callbacks und asynchronen Verarbeitung, Sie wissen nicht, wann es ausgeführt wird, oder zumindest wird es oft nach dem anderen Code ausgeführt werden. In angularJS gibt es keine Möglichkeit, eine synchrone Anfrage zu machen. Sie müssen Ihren Code in die Erfolgsfunktion verschieben.

+0

Alles wahr, Reihenfolge der Ausführung ist sehr nett, +1! –

0

$ http.get liefert immer ein Versprechen.
Wenn Sie das Versprechen Wert erhalten möchten, dass Sie es in der success Rückruf tun sollten, wie folgt aus:

var final; 
$http.get('someUrl').success(function(response) { 
final = response; 
}); 

Keine Notwendigkeit für resData, wird nur ein Versprechen Kette verursachen, etwas, das Sie brauchen nicht in dieser Fall.

+0

Versucht dies, aber wenn ich endgültig im Erfolg definiere Sein Bereich bleibt nur für die lokale Erfolgsfunktion.Ie außerhalb der endgültigen Variable bleibt immer noch undefiniert. –

+0

Wenn Sie debuggen, haben Sie die Erfolgsfunktion getroffen? vielleicht wurde das Versprechen abgelehnt und _final_ wurde nicht geändert. – AranS

+0

Es gab Fälle, in denen ich eine Komponente Eigenschaften deklariert, dann im Konstruktor eine asynchrone Funktion aufgerufen haben. Nachdem ein Versprechen zurückgegeben wurde, habe ich die Eigenschaften ausgefüllt (mit 'then)'. Es ist mir unklar, warum die Variable _final_ nicht im Geltungsbereich ist. @Cyril Gandon? – AranS

2

Solange Sie einen Netzwerkanruf tätigen, werden Ihre Daten asynchron zurückgegeben, es liegt in der Natur davon, Sie können nicht dagegen ankämpfen.

var wrongFinal; // <-- nope, final will never get into that scope 
$http.get('http://localhost:9000/therapist_data',config) 
    .success(function(response) { 
    console.log("I got the data I requested"); 
    var goodFinal = reponse; // <-- yes, here, the data lived 
    // do something with the data here 
}); 

console.log(wrongFinal); // nop, wrong scope, no sense, data doesn't live here 

Soooooo, ist die Antwort eine Frage:

Was wollen Sie mit Ihren Daten zu tun?

Es hängt vom Ziel ab. Werden Sie einen weiteren Netzwerkanruf tätigen? Möchten Sie die Ansicht aktualisieren? Möchten Sie eine 3rd-Party-Bibliothek anrufen?

Sie müssen die Natur von asynchron in JavaScript verstehen und umarmen.

+0

Ja, tatsächlich ist der obige Code innerhalb einer anderen Erfolgsfunktion eines anderen http get.Its verschachtelten Netzwerkaufrufe. –

Verwandte Themen