2016-08-21 4 views
0

Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь получить данные с моей фабрики до моего контроллера, чтобы контроллер мог получить доступ к этим данным. В настоящее время, когда я удаляю консоль из данных, я получаю пустой объект, но если я изучу данные дальше, я получаю, что вся «ценность была снята, но здесь она живая» в 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 будет обрабатывать мой вопрос, но это явно не так. Что я делаю не так?

+0

Ваш поиск данных должен быть внутри userRetrievalSuccess в '.then'. Прямо сейчас вы просто надеетесь, что console.log вызывается после вызова пользователяRetrievalSuccess – Ladmerc

+0

@Ladmerc Я не совсем понимаю, что вы говорите. Данные извлекаются в userRetrievalSuccess, когда я говорю 'data.users = response.data', и снова, когда я устанавливаю' data.XPillar = xPillarData' ... не так ли? – DonnyBrook

+1

Вам не хватает того, что его асинхронно. это означает, что при t0 вы вызываете услугу, при t0 + несколько наносекунд вы печатаете данные, а затем намного позже, при T0 + полсекунды, когда возвращается ответ HTTP, выполняется функция userRetrievalSuccess и заполняется данные. Служба должна вернуть обещание. Прочтите http://blog.ninja-squad.com/2015/05/28/angularjs-promises/ –

ответ

0

Оказалось, что добавление второго обещания /. Затем на стороне контроллера позаботилось о моих проблемах. Но благодаря @ JB-Nizet и @Ladmerc за помощь!