Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь получить данные с моей фабрики до моего контроллера, чтобы контроллер мог получить доступ к этим данным. В настоящее время, когда я удаляю консоль из данных, я получаю пустой объект, но если я изучу данные дальше, я получаю, что вся «ценность была снята, но здесь она живая» в Chrome.AngularJS - получение асинхронных данных с завода для использования в контроллере
Вот мой завод, названный DataService:
var data = {};
var firstPillarData = {};
var secondPillarData = {};
var thirdPillarData = {};
firstPillarData.ourArray = [];
secondPillarData.ourArray = [];
thirdPillarData.ourArray = [];
function userRetrievalSuccess(response){
console.log('userRetrievalSuccess', response.data);
data.users = response.data;
console.log('data.users is', data.users);
console.log('and the data object is', data);
for(var i = 0; i < data.users.length; i++){
if(data.users[i].initiatives != null){
console.log("we have initiatives for this user", data.users[i]);
for(var j = 0; j < data.users[i].initiatives.length; j++){
switch(data.users[i].initiatives[j].pillar){
case 1:
firstPillarData.ourArray.push(data.users[i].initiatives[j]);
break;
case 2:
secondPillarData.ourArray.push(data.users[i].initiatives[j]);
break;
case 3:
thirdPillarData.ourArray.push(data.users[i].initiatives[j]);
break;
default:
break;
}
}
}
}
data.firstPillarData = firstPillarData;
data.secondPillarData = secondPillarData;
data.thirdPillarData = thirdPillarData;
console.log("our data.firstPillarData is", data.firstPillarData);
console.log("our data.secondPillarData is", data.secondPillarData);
console.log("our data.thirdPillarData is", data.thirdPillarData);
return data;
}
function userRetrievalFail(){
console.log('error retrieving users');
}
function getAllUserData(){
$http.get('/kpi/allUsers/').then(userRetrievalSuccess, userRetrievalFail)
}
А вот где его называют в мой контроллер:
DataService.getAllUserData();
var data = DataService.data;
Я думал, что с помощью метода .then
на $http.get
будет обрабатывать мой вопрос, но это явно не так. Что я делаю не так?
Ваш поиск данных должен быть внутри userRetrievalSuccess в '.then'. Прямо сейчас вы просто надеетесь, что console.log вызывается после вызова пользователяRetrievalSuccess – Ladmerc
@Ladmerc Я не совсем понимаю, что вы говорите. Данные извлекаются в userRetrievalSuccess, когда я говорю 'data.users = response.data', и снова, когда я устанавливаю' data.XPillar = xPillarData' ... не так ли? – DonnyBrook
Вам не хватает того, что его асинхронно. это означает, что при t0 вы вызываете услугу, при t0 + несколько наносекунд вы печатаете данные, а затем намного позже, при T0 + полсекунды, когда возвращается ответ HTTP, выполняется функция userRetrievalSuccess и заполняется данные. Служба должна вернуть обещание. Прочтите http://blog.ninja-squad.com/2015/05/28/angularjs-promises/ –