2014-02-22 2 views
0

Chrome 콘솔에서 showFriends() 함수를 실행하면 해당 데이터를 볼 수 있습니다. 그러나 코드에서 $ .each 함수 다음에 showFriends()를 호출합니다 - 비동기 적으로 실행 중이므로 실패합니다.

내가 .promise 체인 시도했습니다() 완료 (showFriends();..?를 $ .each 기능을하지만 그 또한 실패 후

어떤 아이디어를

var myApp = {}; 
myApp.fbFriends = []; 

function showFriends() { 
    console.log(myApp.fbFriends); 
} 

function getFriends() { 

    FB.api('/me/friends?fields=birthday', function(response) { 
    var friendsBirthdays = response.data; 
    friendsIdArray = friendsBirthdays.map(function(user) { return user.id }); 
    createFriendsArray(friendsIdArray); 
    }); 

    function createFriendsArray(friendsIdArray) { 

    $.each(friendsIdArray, function(index, value) { 
     FB.api(value.toString(), function(response) { 
     myApp.fbFriends.push(response); 
     }); 
    }); 
    showFriends(); 
    } 
} 
+3

'each'는 비동기 적이 지 않으므로'FB.api' 호출은 아마도 async입니다. – tymeJV

+0

'done()'jquery – rockStar

+0

@rockStar를 사용할 수도 있습니다. 어떻게해야합니까? '.done'을 호출하기 전에 약속이 필요합니다. –

답변

1

아무것도, 당신을 각 푸시 후 friendIdArray 및 myApp.fbFriends의 길이를 비교할 수 있습니다, 그들은 showFriends()를 실행, 같은과 0보다 큰를하는 경우 즉, 친구가 마지막 반복 후에 표시됩니다 보장합니다

을이 같은 일 :..

$.each(friendsIdArray, function(index, value) { 
    FB.api(value.toString(), function(response) { 
    myApp.fbFriends.push(response); 
    if (myApp.fbFriends.length == friendsIdArray.length) 
     showFriends(); 
    }); 
}); 
+1

+1 지연된 객체/약속을 제안하려고했지만 오버 헤드가 훨씬 적습니다. 나중에 코드를 분리 할 수 ​​있다는 약속이 유용 할 수 있습니다. –

+0

예, 이것과 같은 간단한 것, 길이를 비교하는 것은 괜찮습니다 ...하지만 복잡한 것에 대해서는 약속 할 것입니다. 고맙습니다! – Shomz

+0

고마워요! 추신 : 실제로 내가 할 수있는 일은 showFriends (응답)와 같은 응답을 전달하는 것이므로 사용 가능한 친구를 표시 할 수 있습니다. –