2016-06-15 47 views
0

개체 배열을 반환하는 내 friendsService에 함수가 있습니다.검색된 데이터를 반복 할 수 없습니다.

friendsService.getTopFriends().then(function(data) { 
    console.log(data); 
}); 

그리고 예상 할 수있다이 같은 응답을 얻을 :

getTopFriends: function() { 
var deferred = $q.defer(); 
var data = []; 
FB.api('/me/photos/uploaded', function(response) { 
    angular.forEach(response.data, function(key, value) { 
     FB.api('/' + key.id + '/tags', function(response) { 
      angular.forEach(response.data, function(key, value) { 
       var res = { 
        id: key.id, 
        name: key.name 
       } 
       FB.api('/' + key.id + '/picture?width=200&height=200', 'GET', function(response) { 
        res.url = response.data.url; 
        data.push(res); 
       }); 
      }); 
     }); 
    }); 
    deferred.resolve(data); 
}); 
return deferred.promise; 

}

그런 다음 내 컨트롤러에서,이처럼 사용할 수 있습니다. enter image description here

그러나 angular.forEach()을 사용하여 해당 데이터를 반복 할 경우 콘솔에서 아무런 결과 나 오류가 표시되지 않습니다. 내 코드에서 어떤 문제가 있는지 어떻게 알 수 있습니까? 어떻게 수정합니까?

+0

데이터를 반복 처리 할 때 js 오류가 발생합니까? 또한 작동하지 않는 정확한 코드를 보여주십시오. –

+0

data [0] .field_name과 같은 응답 json의 특정 필드에 액세스하여 표시되는지 확인하십시오. 그러면 forEach 루프에서 무엇이 잘못되었는지 추적 할 수 있습니다. – MasterMohsin

+0

응답에 데이터 필드가없는 것 같습니다. 당신은'response.data'가 아닌'응답 '을 반복하려고 노력해야합니다. 희망이 hepls –

답변

0

배열을 채우는 호출이 완료되기 전에 약속이 해결됩니다.

friendsService.getTopFriends().then(function(data) { 
    console.log(data); 
}); 

는 하늘의 배열됩니다

이 다음에 data는 것을 의미한다.

angular.forEach()은 오류가 발생하지 않지만 요소가 없으므로 아무런 조치도 취하지 않습니다.

console.log 조금 다르게 작동합니다. []

이것은 console.log(data) 문이 실행될 때, 배열이 비어 있음을 의미합니다 : 화살표 옆에 스크린 샷의 상단에

당신은 하늘의 배열을 참조하십시오. 당신이 파란색 배경으로 i를 올려 놓으면

사실, 말할 것이다 :

Object value at left was snapshotted when logged, value below was evaluated just now. 

당신이 확장 배열의 내용을 검사하기 위해 콘솔에서 클릭하면 배열이 재평가 및 표시되었다. 이 시간이 지나면 api 호출이 완료되고 배열이 채워집니다.

deferred.resolve(data);으로 호출을 이동시켜 가장 안쪽 콜백으로 바꾸고 모든 콜백이 끝나면 호출하면됩니다.

+0

가장 안쪽의 콜백은'angular.forEach()'문장 안에 있기 때문에, 정확히 어떻게 작동할까요? 이 약속은 첫 번째 반복에서 해결 될 것이고 나머지 데이터는 얻지 못할 것입니다. 나 맞아? – Rafay

+0

예, 맞습니다. 마지막 일이 끝난 후에 만 ​​해결해야합니다. 따라서 현재 디자인에서 개수를 추적하여 길이와 비교하거나 ForEach 대신 for 루프 및 인덱스를 사용하십시오. – tasseKATT

관련 문제