2016-08-16 3 views
2

я этот фабричный Тар вызов внешнего апи, который возвращает массив:Angularjs завода HTTP возвращаемое значение

angular.module('starter.services', []) 
.factory('PlacesService', function($http) { 
    var places = ""; 
    var request = $http({ 
    method: "get", 
    url: 'http://someurl/getPlaces.php' 
    }); 

request.then(function (data) { 
    places = data.response 
}); 

console.log(places); // return empty string 

return { 
    all: function() { 
    return places; 
    }, 
    get: function(placesId) { 
    return places[placesId]; 
    } 
} 
}); 

места переменного возвращаемый НТТРОМ пустая строка. Если я инициализирую места как массив, а я использую places.push (data.response), он работает, но возвращает массив массивов. Не могли бы вы мне помочь?

+0

Ваше обещание кажется отклоненным, поэтому ваша переменная по-прежнему является пустой строкой. Попробуйте следующее: request.then (функция (данные) { places = data.response }, функция (ошибка) {console.log (ошибка);}); –

+0

Ошибка ... только пустая строка из console.log (места); –

+0

Хахаха, не могу поверить, что я упустил эту деталь, @Todd Miller прав :) –

ответ

2

Ваш логин здесь за пределами контекста обещания $http звонок возвращается. В основном журнал запускается до того, как обещание будет разрешено, поэтому ваша строка все еще пуста, когда журнал выполняется.

+0

Я догадался. Как я могу справиться с обещанием иметь правильные значения мест вне функции? –

+0

Ну, это зависит от того, что вы хотите сделать со значением. Обычная картина заключается в том, чтобы вернуть обещание, генерируемое вызовом '$ http', чтобы другие части вашего приложения прекратили выполнение до тех пор, пока обещание не будет разрешено. Обычно я буду обрабатывать это свойство 'resolve' маршрута - контроллер не будет срабатывать до тех пор, пока обещание не будет разрешено, поэтому вы можете быть уверены, что когда вы вызываете функцию' all' или 'get',' places' будет иметь правильные значения. –