2016-04-03 16 views
0

ich eine Variable in einem Controller definiert haben:

app.controller('myController',['$scope','ajaxCall',function($scope,ajaxCall){ 
    $scope.interviewer = {}; 
    ajaxCall.get(/* A url */).then(function(response){ 
    $scope.interviewer = response.data; 
    console.log($scope.interviewer); 
}); 
console.log($scope.interviewer); 

ajaxCall ist eine individuelle Dienstleistung, die Ajax-Anrufe zu tätigen, verwendet wird. Die innere Konsole funktioniert einwandfrei (d. H. Es werden die vollständigen Daten angezeigt), aber die äußere Konsole druckt ein leeres Objekt. Warum?

Antwort

2

Weil die erste A in AJAX bedeutet "Asynchronous".

Die Funktion then() geben wird asynchron, eine lange Zeit nach der letzten console.log() Zeile ausgeführt. Es wird ausgeführt, sobald die Antwort auf die asynchrone HTTP-Anfrage vom Server zurückkommt.

Wenn es synchron war, würden wir uns nicht mit Versprechungen und Rückruffunktionen beschäftigen. Wir tun nur

var response = ajaxCall.get(url); 

Aber das ist nicht möglich, so dass wir tun

ajaxCall.get(/* A url */).then(function(response){ 

was bedeutet: bitte Anfrage senden, und wenn die Antwort verfügbar ist, dann diese Funktion aufrufen. Ich werde in der Zwischenzeit viele andere Dinge tun.

+0

Dank @JB Nizet. Ich kannte dieses Konzept, konnte mir aber nicht vorstellen, dass es der Grund dafür ist. Aber ich muss die Daten in den meisten Teilen meines Controllers verwenden, also wie das geht, möchte ich nicht viel Code innerhalb des then schreiben() Funktion. –

+0

Deklarieren Sie eine Funktion 'function init (response) {...}' und verwenden Sie 'ajaxCall.get (url) .then (init);' –

Verwandte Themen