AngularJS $http успешно, но не работает

я использую angularJS и SLIM PHP restful server, служба PHP работает, и на самом деле я уже использовал $http.get() без проблем в этом приложении... Но теперь происходит странная вещь, я создал новую функцию так же, как и другие, и он получает .success(function(data)) без проблем, я действительно могу использовать console.log(data), и он показывает правильные результаты, но когда .success() завершается и возвращается, я получить неопределенный результат. PS: в консоли браузера нет ошибки.

    var markerOptions = [];
    loadMarkers();
    console.log(markerOptions);

    function loadMarkers() {
    $http.get('http://localhost/rest/getMarkers').success(function(response){
            console.log(response);
            markerOptions = response;
    });
}
  • Console.log() внутри success() возвращает правильные данные
  • Console.log() после возврата loadMarkers() undefined

person Felipe    schedule 09.05.2014    source источник
comment
Поскольку $http.get является асинхронным, его результаты не доступны сразу же, как только ваш синхронный код начинает работать. Вот почему ваш console.log пуст за пределами success.   -  person Marc Kline    schedule 10.05.2014
comment
См.: stackoverflow.com/questions/14220321/   -  person Marc Kline    schedule 10.05.2014
comment
Кстати, это очень распространенная болевая точка, которая стоит головной боли раз и навсегда.   -  person Marc Kline    schedule 10.05.2014
comment
хм, я понял, большое спасибо, Марк. Сейчас я пытаюсь найти решение для этого в угловом... но ты покажи мне путь, ты снова.   -  person Felipe    schedule 10.05.2014
comment
Главный ответ в приведенной выше статье отлично подходит для начинающих, а затем вы можете прочитать документацию по $q в Angular для получения дополнительной пищи для размышлений.   -  person Marc Kline    schedule 10.05.2014


Ответы (1)


Комментарии @MarcKline верны. В любом случае, следуя тому, что, как я думаю, вы пытаетесь достичь с помощью этого фрагмента кода, вы можете назначить возвращаемые данные из ответа ajax переменной области видимости (при условии, что вы используете $scope), например $scope.markerOptions = response. Вы можете объявить markOptions как переменную области действия с помощью var $scope.markOptions = [] (... и, конечно же, зарегистрировать ее с помощью console.log($scope.markOptions) соответственно). Кроме того, определите $scope.loadMarkers = function() {...} и назовите его $scope.loadMarkers()

Область будет обновлена, как только клиентская сторона получит ответ ajax. Надеюсь, что это поможет вашим текущим потребностям в дополнение к лучшему пониманию асинхронного подхода javasciprt, поскольку некоторые из его принципов были объяснены вам в комментариях.

person Kludge    schedule 10.05.2014
comment
Я пробую это, и не работает, я тоже пытаюсь использовать .then() ... но все равно не работает :( - person Felipe; 10.05.2014
comment
определите loadMarkers как функцию области действия с помощью $scope.loadMarkers = function() {...} и вызовите ее с помощью $scope.loadMarkers() - person Kludge; 10.05.2014