У меня есть список имен в локально сохраненный файле JSON:ресурс обещания не решение с .then
[
{
"SID": "ADYN"
},
{
"SID": "ANGRYPIXEL"
}
]
У меня есть служба, используя $ ресурса для успешного чтения файла в формате JSON:
FrontEndApp.factory('readFileService', function ($resource) {
return $resource('data/:file',{file: "@file"});
});
Когда вы просто печатаете на 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 не является функцией»
EDIT: Исходя из предложения, я попробовал console.log (data.data), который не определен. console.log (data) показывает массив из 331 объектов, что должно быть, потому что у моего полного JSON-файла есть 331 объект.
Это становится интересным: когда я пробовал данные [0] .SID, я получил свое имя! Однако, если я запустил (org in data), он работает только для первой организации. Зачем?
В качестве временного решения можно напечатать объекты, используя счетчик цикла:
var i = 0;
for(org in data){
console.log(data[i]);
i++;
}
странно, что выводит все 331, а затем 2 больше «не определено»
EDIT2: Хорошо, так что я получил мое приложение, работающее с каким-то неприятным видом обходного кода, за исключением того, что я получаю сообщение об ошибке в консоли, когда «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++;
}
});
EDIT3: Спасибо Динеш! Так,
для (пункт в деталях) item.attribute не работает, но
для (пункт в деталях) элементы [пункт] .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' будет массивом? Вы должны использовать правильный цикл, см. [Почему используется 'for ... in' на массивах такая плохая идея?] (Https://stackoverflow.com/q/500504/1048572) – Bergi