簡體   English   中英

資源承諾未使用.then解決

[英]resource promise not resolving with .then

我在本地存儲的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(數據中的組織),則它僅適用於第一個組織。 為什么?

解決方法是,我可以使用循環計數器打印對象:

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

奇怪的是,它打印出所有331,然后再打印2個“ undefined”

EDIT2:好的,所以我讓我的應用程序使用了一些看起來很討厭的解決方法代碼,除了當'i'增量過高(我猜它包括一對promise對象)時,控制台中出現錯誤。 這不可能是處理數據的“正確”方法。

$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++;
        }
});

EDIT3:謝謝Dinesh! 所以,

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

也許這個pl夫可以幫助您。 用下面的代碼

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM