2016-04-03 6 views
0

У меня есть переменная, определенный в контроллере:

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 является таможенная служба, которая используется, чтобы сделать AJAX вызовы. Внутренняя консоль работает нормально (т. Е. Отображает полные данные), но внешняя консоль печатает пустой объект. Почему?

ответ

2

Потому что первые A в AJAX означает «Асинхронный».

Функция передается then() выполняется асинхронно, долгое время после последней console.log() линии. Он выполняется, как только ответ на асинхронный запрос HTTP возвращается с сервера.

Если бы это было синхронно, мы бы не потрудились с обещаниями и функциями обратного вызова. Мы бы просто сделать

var response = ajaxCall.get(url); 

Но это не представляется возможным, поэтому мы делаем

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

что означает: пожалуйста, отправьте этот запрос, и если ответ доступен, затем вызвать эту функцию. Тем временем я сделаю много других вещей.

+0

Спасибо @JB Nizet. Я знал эту концепцию, но не мог думать о том, что это причина. Но мне приходится использовать данные в большей части моего контроллера, поэтому, как это сделать, я не хочу писать много кода внутри then() функция. –

+0

Declaure function 'function init (response) {...}' и использовать 'ajaxCall.get (url) .then (init);' –

Смежные вопросы