2016-08-21 55 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

您的數據檢索應該在'.then'的userRetrievalSuccess中。 現在你只是希望在調用userRetrievalSuccess之後調用console.log – Ladmerc

+0

@Ladmerc我不完全理解你在說什麼。當我說'data.users = response.data'時,數據在userRetrievalSuccess中被檢索到,並且當我設置'data.XPillar = xPillarData'時又是這樣的...不是嗎? – DonnyBrook

+1

你錯過了它的異步事實。這意味着在t0時刻,你在t0 +幾納秒的時間內調用服務,打印數據,然後在稍後的T0 +半秒內,當http響應返回時,執行userRetrievalSuccess函數並填充數據。該服務應該返回一個承諾。閱讀http://blog.ninja-squad.com/2015/05/28/angularjs-promises/ –

回答

0

事實證明,在控制器端添加第二個承諾/ .then照顧我的問題。但是感謝@ JB-Nizet和@Ladmerc的幫助!

相關問題