2016-04-24 3 views
0

У меня есть список имен в локально сохраненный файле 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 
}]); 
+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); 
    } 
} 
Смежные вопросы