【问题标题】:resource promise not resolving with .then资源承诺不能用 .then 解决
【发布时间】:2016-04-24 18:04:38
【问题描述】:

我在本地存储的 JSON 文件中有一个名称列表:

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

我有一个服务使用 $resource 来成功读取 JSON 文件:

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

当只是打印到 HTML 视图时,名称列表可以正常工作。但是,我想使用 JSON 文件中的名称来查询 API。通过使用“.then”,我可以识别文件中名称的数量,但不能访问名称本身:

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);
            //});
        }
});

是否应该使用 '.then' 不延迟代码的其余部分,直到承诺解决?由于 JSON 文件是本地的,因此没有失败的可能性。如何停止我的 for 循环,直到它的承诺解决?

我尝试使用 $scope.orgData = data.toJSON();正如几篇文章所推荐的,但我得到“错误:data.toJSON 不是函数”

编辑: 根据一个建议,我尝试了未定义的 console.log(data.data)。 console.log(data) 显示了一个包含 331 个对象的数组,因为我的完整 JSON 文件中有 331 个对象。

有趣的是:当我尝试 data[0].SID 时,我得到了第一个名字!但是,如果我运行 for(org in data),它只适用于第一个 org。为什么?

作为一种解决方法,我可以使用循环计数器打印对象:

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

奇怪的是,打印出所有 331,然后打印出另外 2 个“未定义”

编辑2: 好的,所以我让我的应用程序使用了一些看起来很讨厌的解决方法代码,除了当我从 'i' 递增太高时在控制台中出现错误(我猜它包括一对承诺对象)。这绝不是处理数据的“正确”方式。

$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: 谢谢迪内什!所以,

for(item in items)item.attribute 不起作用,但是

for(item in items)items[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
}]);

【问题讨论】:

  • 试试这个 $scope.orgData = data.data;
  • 是否分配了$scope.orgData?如果是这样,你的承诺就解决了。如果不是,那么您的承诺在请求文件时遇到错误。尝试附加 .catch 以查看您是否在不知不觉中遇到了异常(尽管 Angular 往往对这些异常大声..)
  • 您似乎期望data 是一个数组?那么你应该使用适当的循环,请参阅Why is using for…in on arrays such a bad idea?

标签: angularjs promise angular-promise


【解决方案1】:

也许这个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);
  }
}

【讨论】:

    猜你喜欢
    • 2015-12-06
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 2013-10-29
    • 2015-11-17
    相关资源
    最近更新 更多