2016-07-21 7 views
0

Ich bin neu in AngularJS. Wie kann ich die Antwort von "response.data" als eine typische Funktion zurückgeben? Da $http eine Zusage generiert, gibt die Funktion beim Beenden der Funktion die Serverantwort nicht zurück.

In meinem Controller habe ich:

this.message2 = function() {     
    $http({ 
     url : 'dataset_of_model', 
     method : "POST", 
     data : { 
      'experiment' : 'rcp85', 
      'model' : 'HadGEM2-ES', 
      'frequency' : 'day' 
     } 
    }).then(function(response) { 
     console.log('qui'); 
     console.log(response.data);        
     return response.data; 
    }, function(response) { 
     //fail case 
     console.log(response); 
     console.log(fallito); 
     return response; 
    }); 
}; 

Wenn ich tun:

this.message2 = function() { 

    var = temp; 

    $http({ 
     url : 'dataset_of_model', 
     method : 'POST', 
     data : { 
      'experiment' : 'rcp85', 
      'model' : 'HadGEM2-ES', 
      'frequency' : 'day' 
     } 
    }).then(function(response) { 
     console.log('qui'); 
     console.log(response.data);         
     temp = response.data; 
    }, function(response) { 
     //fail case 
     console.log(response); 
     console.log(fallito); 
     return response; 
    }); 

    return temp;    
}; 

Die Rückkehr temp die Daten nicht haben, weil es vor Daten zurückgibt, auch wenn ich zum Beispiel warten 10 Sekunden vor der Rückkehr.

Wie kann ich Daten synchron zurückgeben?

Danke !!

+0

Ich glaube, es gibt keinen Weg. JavaScript ist single-threaded und kann es sich nie leisten, zu stoppen und auf die Fertigstellung einer bestimmten Funktion zu warten. –

+1

Mögliches Duplikat von [Wie gebe ich die Antwort von einem asynchronen Anruf zurück?] (Http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) –

Antwort

-1

Ich bin nicht sicher, warum würde das tun wollen? Sie geben in der ersten Option sowieso response.data zurück. Sie sollten wahrscheinlich auch eine Rückgabe vor dem $ http hinzufügen (auf diese Weise geben Sie das Versprechen zurück). Alles, was mit der Antwort synchronisiert werden soll, muss jedoch im Block .then liegen. Wenn Sie beispielsweise eine Antwort auf alle erzielten Tore erhalten möchten, fügen Sie diese Zahl zu einer Variablen hinzu. Sie müssten diese Funktionalität in den Block .then einfügen und dann die Antwortdatei am Ende des Blocks zurückgeben.

Auf diese Weise sind die innerhalb des then-Blocks ausgeführten Funktionen synchron.

Sie haben keine Garantie für die Funktionen, die außerhalb des then-Blocks ausgeführt werden, es sei denn, Sie möchten es mit $ timeout hacken (für 2 Sekunden anhalten, dann die Rücklauftemperatur ausführen), was ich nicht empfehle.

0

Versuchen Sie dies.

this.getResults = function(){ 
    return $http.get(url).then(function(res){ 
     //Resquest successs 
    }, function(err){ 
     //Resquest fail 
    }); 
} 

Und dann

MyFooService.getResults().then(...); 
+0

Warum nicht einfach $ http zurückgeben? –

+0

So können Sie optional die Antwort verarbeiten, bevor Sie das Versprechen lösen. Wie das Reinigen der Ausgabe, das Zusammenfassen von Ergebnissen, etc. Aber ja, funktioniert auch nur die $ http; – alex030293

+0

Richtig, Sie können all das tun, ohne $ q zu verwenden. $ http gibt bereits eine Zusage zurück. –

Verwandte Themen