2012-12-13 5 views
1

페이지에 대한 최종 조치 (반환 된 요청 수 계산 횟수 업데이트)를 완료하기 전에 페이스 북에 대한 여러 요청이 완료 될 때까지 기다려야하지만 접근 방법은 확실하지 않습니다.여러 비동기 페이 스북 요청을 기다리는 중

함수를 실행하기 전에 각 함수가 완료되었는지 확인하고 카운터를 업데이트하십시오.
window.load은 로그인 후 페이지를 새로 고치지 않으면 너무 빠릅니다 ...?

window.fbAsyncInit = function() { 
    FB.init({ 
    appId: 'id', // App ID 
    //channelUrl: '//facebookdev.smithbrosagency.com/LOL/xss_channel.htm', // Channel File 
    status: true, // check login status 
    cookie: true, // enable cookies to allow the server to access the session 
    xfbml: true // parse XFBML 
    }); 

    getStatus(); 

     //Subscribe to events 
    FB.Event.subscribe('auth.statusChange', function (response) { if (response.authResponse) { getStatus(); } }); 
    FB.Event.subscribe('auth.login', function (response) { if (response.status === 'connected') { getStatus(); } }); 
    }; 
    function getStatus() { 
     FB.getLoginStatus(function (response) { 

     if (response.status === 'connected') { 
     setPanel('results'); // connected 

     var accessToken = response.authResponse.accessToken; 

     var obj = getPermissionsObject(function (permissions) { 

     getUserInfo(response); 

     getUserPhotos(response, accessToken); 

     getFriends(response, accessToken); 

     getUserLocations(response, accessToken); 

     getUserMusic(response, accessToken); 

     getUserMovies(response, accessToken); 

      }); 
     } else { 
     setPanel('login'); // not logged in or unauthorized 
     } 
     }); 
    } 
    function getUserPhotos(response, accessToken) { 

     FB.api('/me/photos?access_token=' + accessToken, function (response) { 
     var photoList = response.data; 
     var len = photoList.length; 
     if (len >= 3) { 

     var max = 3; 
    if (len > max) { len = max }; // cap it at 3 

    for (var i = 0; i < len; i++) { 
    (function() { 
    var j = i; 
    var idx = i + 1; 
    $('.result2 .option' + idx + ' input').val(photoList[i].picture); 
    $('.result2 .option' + idx + ' img').attr("src", photoList[i].picture); 

     })(); 
    } 
     $('div.result2').addClass("active"); 
     $('#q2 input').val(1); // add to hidden to count results 
      } 
    else { 
     // hide & subtract from total questions 
     $('div.result2').addClass("inactive"); 
     $('#q2 input').val(0); 
     } 
     }); 
    } 

    $(window).load(function() { 
     $.when($('#q2 input').val() != '' && $('#q4 input').val() != '' && $('#q5 input').val() != '').then(test()); 

     function test() { 

     // calc total questions 
     var total = 0; 

     $("#Results div input[hidden]").each(function() { 
     total += $(this).val() * 1; 
     }); 
     alert(total); 
     } 
    }); 

답변

0

난 당신을 제대로 이해하고 있는지 확실하지 않습니다하지만이 같은 객체 구현해야 할 것 같다

<script type="text/javascript"> 

//Monitoring object 
function RequestStatusMonitor() 
{ 
    this.resetRequests(); 
} 

//IDs of the requests you need to monitor 
RequestStatusMonitor.prototype.requests=["firstRequest","secondRequest","thirdRequest"]; 

//Status of the requests 
RequestStatusMonitor.prototype.requestsCompleted=[]; 

//Set all requests to incomplete state 
RequestStatusMonitor.prototype.resetRequests = function() 
{ 
    this.requestsCompleted = []; 
    for(var it in this.requests) 
    { 
     this.requestsCompleted[this.requests[it]] = false; 
    } 
} 
//Set status for a request determined by requestName 
RequestStatusMonitor.prototype.setRequestStatus = function(requestName, status) 
{ 
    this.requestsCompleted[requestName] = status; 
} 

//Check if all requests are completed 
RequestStatusMonitor.prototype.allRequestsAreCompleted = function() 
{ 
    for(var it in this.requestsCompleted) 
    { 
     if(!this.requestsCompleted[it]) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

//---------------------------------------------------------------------------------- 
//Usage Example 
var monitor = new RequestStatusMonitor(); 

function onFirstRequestFinished(/*necessary parameters*/) 
{ 
    monitor.setRequestStatus("firstRequest", true); 
    checkCompleted(); 
} 

function onSecondRequestFinished(/*necessary parameters*/) 
{ 
    monitor.setRequestStatus("secondRequest", true); 
    checkCompleted(); 
} 

function onThirdRequestFinished(/*necessary parameters*/) 
{ 
    monitor.setRequestStatus("thirdRequest", true); 
    checkCompleted(); 
} 

function checkCompleted() 
{ 
    if(monitor.allRequestsAreCompleted()) 
    { 
     //Do what you need after all requests are completed 
     alert("All requests are completed"); 
    } 
} 

onFirstRequestFinished(); 
onThirdRequestFinished(); 
onSecondRequestFinished(); 

</script> 
+0

감사 미하일를! 정확히 내가 시도한 것. – user1899819