资源承诺不解决 .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”来延迟代码的其余部分直到 promise 解决?由于 JSON 文件是本地文件,因此不可能失败。我如何停止我的 for 循环直到它的 promise 解决?
我尝试使用 $scope.orgData = data.toJSON();正如几个帖子所推荐的,但我得到 "Error: data.toJSON is not a function"
编辑:
根据建议,我尝试了未定义的 console.log(data.data)。 console.log(data) 显示了一个包含 331 个对象的数组,这是应该的,因为我的完整 JSON 文件中有 331 个对象。
有趣的是:当我尝试 data[0].SID 时,我得到了名字!但是,如果我 运行 for(org in data),它只适用于第一个组织。为什么?
作为解决方法,我可以使用循环计数器打印对象:
var i = 0;
for(org in data){
console.log(data[i]);
i++;
}
奇怪的是,打印出全部 331,然后再打印出 2 个 'undefined'
编辑2:
好吧,所以我让我的应用程序使用一些看起来很讨厌的解决方法代码,除了当从 'i' 递增太高时我在控制台中收到错误(我猜它包含一对 promise 对象)。这不可能是 "correct" 处理数据的方式。
$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 摆脱了试图循环 promised/resolved
时出现的控制台错误
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
}]);
也许这个 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);
}
}
我在本地存储的 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”来延迟代码的其余部分直到 promise 解决?由于 JSON 文件是本地文件,因此不可能失败。我如何停止我的 for 循环直到它的 promise 解决?
我尝试使用 $scope.orgData = data.toJSON();正如几个帖子所推荐的,但我得到 "Error: data.toJSON is not a function"
编辑: 根据建议,我尝试了未定义的 console.log(data.data)。 console.log(data) 显示了一个包含 331 个对象的数组,这是应该的,因为我的完整 JSON 文件中有 331 个对象。
有趣的是:当我尝试 data[0].SID 时,我得到了名字!但是,如果我 运行 for(org in data),它只适用于第一个组织。为什么?
作为解决方法,我可以使用循环计数器打印对象:
var i = 0;
for(org in data){
console.log(data[i]);
i++;
}
奇怪的是,打印出全部 331,然后再打印出 2 个 'undefined'
编辑2: 好吧,所以我让我的应用程序使用一些看起来很讨厌的解决方法代码,除了当从 'i' 递增太高时我在控制台中收到错误(我猜它包含一对 promise 对象)。这不可能是 "correct" 处理数据的方式。
$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 摆脱了试图循环 promised/resolved
时出现的控制台错误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
}]);
也许这个 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);
}
}