2016-04-24 131 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); 
    } 
}