AngularJS: присвоить данные $http.get переменной

Я пытаюсь присвоить данные из $http.get переменной в моем контроллере.

 $http.get(URL).success(function (data) {
      $scope.results = data;
      console.log('results in $http.get :'+ $scope.results);
    });

 console.log('results after http.get'+ $scope.results);

Первые данные печати журнала консоли из get. После $http.get(url).success $scope.results печатается как undefined.


comment
Как указывалось в других ответах, метод является асинхронным, поэтому он возвращается немедленно. Обратный вызов успеха вызывается, когда он завершается и заполняет вашу переменную, и если вы правильно настроили привязки, ваш пользовательский интерфейс обновится. Он ведет себя именно так, как должен.   -  person Lee Willis    schedule 03.12.2014
comment
Теперь я пытаюсь получить такие данные: var getSomething = function(){ return $http({method:GET, url:URL}).then(function(result){return result.data; }); }; и присвойте результат переменной: $scope.results = getSomething();   -  person hwg    schedule 03.12.2014


Ответы (2)


Это потому, что $http.get является асинхронным. Таким образом, ваш код не будет приостановлен до тех пор, пока запрос ajax не будет завершен, вместо этого он выполнит остальную часть кода. Таким образом, ваш второй console.log будет выполнен до завершения запроса ajax. На данный момент нет переменной области видимости с именем $scope.results, которая определяется только после завершения запроса, поэтому она печатает undefined. Ваш первый console.log будет напечатан только после успешного завершения $http ajax, в этот момент у вас есть $scope.results, который назначен data, поступающему из бэкэнда.

person Kalhan.Toress    schedule 03.12.2014
comment
@ktoress, так как же заставить http.get не быть асинхронным и получить значение в области видимости? - person Demodave; 12.02.2015
comment
Значение все равно попадет в $scope, но это может занять больше времени (скажем, полсекунды). Дело в том, когда и где вы хотите его использовать. Если вы хотите показать его в представлении, вы можете использовать событие, чтобы убедиться, что оно загружено, или просто подождать. Если вам это нужно для другой функции, вы можете вызвать эту функцию внутри вызова sucess(). - person Puce; 10.03.2015

$http является функцией asynchronous. Он возвращается мгновенно, однако возвращает promise не настоящий результат. Когда запрос выполнен, вызывается onsuccess.

Второй (тот, что вне вызова) console.log выполняется до возврата $http.

person Mihai Dinculescu    schedule 03.12.2014