2016-04-24 250 views
0

解決我的名字在本地存儲的JSON文件列表:資源承諾不。然後

FrontEndApp.factory('readFileService', function ($resource) { 
    return $resource('data/:file',{file: "@file"}); 
}); 

[ 
    { 
     "SID": "ADYN" 
    }, 
    { 
     "SID": "ANGRYPIXEL" 
    } 
] 

我使用$資源成功地讀取JSON文件有一個服務

僅當打印到HTML視圖時,名稱列表才能正常工作。但是,我想使用JSON文件中的名稱來查詢API。通過使用「於是」,我可以識別名稱的數量在文件中,但不能訪問它們的名稱:

var query = readFileService.query({file: "orgList.json"}); 
query.$promise.then(function(data){ 
     $scope.orgData = data; 

     //promise still not resolved?? 
     for(org in $scope.orgData){ 
      console.log(org);// prints 0 1 instead of objects 
      console.log(org.SID);// undefined instead of ADYN ANGRYPIXEL 
      //var results = getMembersService.get({orgName: org.SID}); 
      //results.$promise.then(function(results){ 
      // for(result in results)$scope.orgDataArray.push(result.name); 
      //}); 
     } 
}); 

應該使用「然後」,直到承諾解決不耽誤代碼的其餘部分?由於JSON文件是本地的,因此不存在失敗的可能性。如何阻止我的for循環,直到它的承諾解決?

我試過使用$ scope.orgData = data.toJSON();作爲幾個職位的建議,但我得到「錯誤:data.toJSON不是一個函數」

編輯: 基於一個建議,我試圖console.log(data.data),這是未定義的。 console.log(data)顯示一個包含331個對象的數組,它應該是因爲我的完整JSON文件中有331個對象。

它變得有趣:當我嘗試數據[0] .SID時,我得到了第一個名字!但是,如果我運行(數據組織),它只適用於第一個組織。爲什麼?

作爲一種變通方法,我可以使用循環計數器打印對象:

var i = 0; 
for(org in data){ 
       console.log(data[i]); 
       i++; 
} 

奇怪的是,打印出所有331,然後2個「未定義」

EDIT2: 好了,所以我得到我的應用程序與一些討厭的尋找解決方法的代碼工作,除了我從控制檯得到一個錯誤,當我從'我'遞增太高(我猜它包含一對承諾對象)。這不是處理數據的「正確」方式。

$scope.orgDataArray = []; 

var query = readFileService.query({file: "orgList.json"}); 
query.$promise.then(function(data){ 
    $scope.orgData = data; 
    console.log(data[0]); 
     var i = 0; 
     console.log(data.length); 
     //promise still not resolved?? 
     for(org in data){ 
      //console.log(data[i].SID); 
      var results = getMembersService.get({orgName: data[i].SID}); 
      results.$promise.then(function(res){ 
       var j=0; 
       for(member in res.data){ 
        //console.log(res.data[j].handle); 
        $scope.orgDataArray.push(res.data[j].handle); 
        j++; 
       } 
      }); 
      i++; 
     } 
}); 

編輯3: 謝謝Dinesh!所以,

爲(以項目的項目)item.attribute不起作用,但

爲(以項目的項目)項目[項目]確實屬性約,那!isNaN接到擺脫控制檯錯誤的在承諾努力環/解決

EDIT4:終極密碼

FrontEndApp.controller('MemberController', ['$scope', '$http', 'readFileService', 'getMembersService', function($scope, $http, readFileService, getMembersService) { 

    $scope.orgDataArray = []; 

    var query = readFileService.query({file: "orgList.json"}); 
    query.$promise.then(function(data){ 
     $scope.orgData = data; 

     for(var org in $scope.orgData){ 
      if(!isNaN(org)){//ignore promise and resolved 
       var results = getMembersService.get({orgName: $scope.orgData[org].SID}); 
       results.$promise.then(function(apiObject){ 
        for(member in apiObject.data){ 
         $scope.orgDataArray.push(apiObject.data[member].handle); 
        } 
       });//end members subquery 
      } 
     } 
    });//end orgList query 
}]); 
+0

試試這個$ scope.orgData = data.data; –

+0

是否分配了'$ scope.orgData'?如果是這樣,你的承諾就解決了。如果沒有,那麼您的承諾在請求文件時遇到錯誤。嘗試附加一個'.catch'來查看你是否在不知不覺中遇到了一個異常(儘管Angular傾向於對這些非常大聲) –

+0

你似乎期望'data'是一個數組?然後你應該使用一個合適的循環,參見[爲什麼在數組中使用'for ... in'這樣一個壞主意?](https://stackoverflow.com/q/500504/1048572) – Bergi

回答

0

可能是這樣plunker可以幫助你。使用以下代碼

for(var org in $scope.orgData){ 
    //for loop will return the key of the $scope.orgData and that will be the array index 
    if(!isNaN(org)){ //to ignore the $promise and $resolve objects from the data 
    console.log($scope.orgData[org]); 
    console.log($scope.orgData[org].SID); 
    } 
}