2012-02-21 4 views
-1

이 비동기 함수가 끝날 때 일부 플래그를 통해 확인하려고합니다.자바 스크립트 비동기 함수가 끝나는 시점을 어떻게 알 수 있습니까?

이것은 내 함수를 호출하는 방법입니다

// Calling the function in a loop 
for (var i=0,l=myIds.length; i<l; ++i) { 
    install(pageId, myIds[i], apps_num[''+myIds[i]], <?php echo $this->comid ?>, '<?php echo $this->site_url; ?>'); 
} 

을 그리고이 제 기능입니다 :

install: function(pageId, appId, app_num, com_id, siteurl) { 
    FB.getLoginStatus(function(response) { 
     // Checking if connected to Facebook 
     if (response.status === 'connected') { 
      var uid = response.authResponse.userID; 
      console.log(response.authResponse); 
      var userAccessToken = response.authResponse.accessToken; 

      // Get page access token 
      FB.api('/'+pageId+'?fields=access_token='+userAccessToken, function(response) { 
       var pageAccessToken = response.access_token; 

       // Get information if user got this application 
       FB.api('/'+pageId+'/tabs/'+appId+'?access_token='+pageAccessToken, 
        function(data) { 
         if (data.data.length < 1) { 
          console.log("Not installed, Installing..."); 

          // Install the application 
          var params = {}; 
          params['app_id'] = appId; 
          FB.api('/'+pageId+'/tabs?access_token='+pageAccessToken, 'post', params, function(response) { 
           if (!response || response.error) { 
            console.log("Error Installing!"); 
           } 
           else { 
            console.log("Installed :)"); 
           } 
          }); 
         } 
         else { 
          console.log("Already installed."); 
         } 
        }); 
       }); 
      } 
      else 
       if (response.status === 'not_authorized') { 
        console.log("the user is logged in to Facebook, but not connected to the app."); 
       } 
       else { 
        console.log("the user isn't even logged in to Facebook."); 
       } 
      }); 
     } 

가 어떻게이 문제를 해결할 수 있습니까? 정적 변수를 사용하려고했지만 비동기 함수 내에서 호출 할 수 없었습니다.

+3

때 콜백이 호출되면 완료되었음을 알 수 있습니다. – Pointy

+0

[Facebook Javascript SDK가 성공적으로로드되었는지 감지하는 방법이 있습니까?] (http://facebook.stackoverflow.com/questions/5334977/is-there-a-way-to-detect-if-the -facebook-javascript-sdk-loaded-successfully) – ifaour

답변

3

일반적으로 비동기 호출의 결과를 알아야하는 코드는 함수 참조를 호출이 끝나면 함수가 호출합니다 ("콜백").

귀하의 경우 그래서

, 당신은 당신의 install 함수에 콜백 매개 변수를 추가 할 것 :

install: function(pageId, appId, app_num, com_id, siteurl, callback) 
//          here ------------^ 

을 ... 그리고 다음을 호출 할 때 적절한 당신이 FB.getLoginStatus 및/또는 FB.api에 전달하는 콜백에서 , 예. 이 같은 뭔가 :

install: function(pageId, appId, app_num, com_id, siteurl, callback) { 
     FB.getLoginStatus(function(response) { 
         // checking if connected to facebook 
       if (response.status === 'connected') { 
       var uid = response.authResponse.userID; 
       console.log(response.authResponse); 
       var userAccessToken = response.authResponse.accessToken; 

       // get page access token 
       FB.api('/'+pageId+'?fields=access_token='+userAccessToken, function(response) { 
        var pageAccessToken = response.access_token; 

        // get information if user got this app 
        FB.api('/'+pageId+'/tabs/'+appId+'?access_token='+pageAccessToken, 
         function(data) { 
         if (data.data.length < 1) { 
          console.log("Not installed, Installing..."); 

          // install the app 
          var params = {}; 
          params['app_id'] = appId; 
          FB.api('/'+pageId+'/tabs?access_token='+pageAccessToken, 'post', params, function(response) { 
           if (!response || response.error) { 
            callback(false, "Error installing"); 
            console.log("Error Installing!"); 
           } else { 
            callback(true, "Installed"); 
            console.log("Installed :)"); 

           } 
           }); 
         } 
         else { 
          callback(false, "Already installed."); 
          console.log("Already installed."); 
         } 
        }); 
       }); 
       } else if (response.status === 'not_authorized') { 
       callback(false, "Logged in but not connected."); 
       console.log("the user is logged in to Facebook, but not connected to the app."); 
       } else { 
       callback(false, "Not logged in."); 
       console.log("the user isn't even logged in to Facebook."); 
       } 
      }); 
     } 

가 나는 콜백 함수에게 두 개의 인수를 포기했습니다 : 부울 설치가 수행 및 상태 메시지되었는지 말.

1

첫째, 당신은 함수 객체

을받을 것이다, 함수에 추가 PARAM를 추가 설치 : 기능 (페이지 id, APPID, app_num, com_id, SITEURL, callbackFunction) {

그런 다음, 내부 기능을 추가

console.log("Installed :)"); 

후, 설치

callbackFunction(); 

이 방법, 당신은 설치 함수를 호출 할 때 :

for (var i=0,l=myIds.length; i<l; ++i) { 
    install(pageId, myIds[i], apps_num[''+myIds[i]], <?php echo $this->comid ?>, '<?php echo $this->site_url; ?>', function(){ 
     //do whatever you want; 
    }); 
} 
1

jQuery를 사용자가 함수가 완료되면 함수가 반응하는 방법을 결정 시켜서 그것을 않습니다. 즉, 함수를 매개 변수로 사용합니다. 이것은 당신이 정말로 정확히 무슨 일이 있었는지 알 필요가 있다면, 당신은 당신의 첫 번째 함수의 성공 여부에 따라, 그 안에 여러 기능을 넣을 수 있습니다, 콜백 추가 보너스로

function install(pageId, appId, app_num, com_id, siteurl, pCallback) { 
    //Doing cool stuff. 
    //OK, I am finished. 
    pCallback(a, b, c) 
} 

function lefinish(a, b, c) { 
    alert(b); 
} 

// Calling install 
install(pageId, appId, app_num, com_id, siteurl, lefinish) 

라고

function install(pageId, appId, app_num, com_id, siteurl, pCallback) { 
    //Doing awesome stuff 
    if (response.status === 'connected') { 
     if (typeof(pCallback.onConnect) == 'function') { 
      pCallback.onConnect(a,b,c); 
     } 
    } 
    else 
     if (response.status === 'not_authorized') { 
      if (typeof(pCallback.onNoAuth) == 'function') { 
       pCallback.onNoAuth(a,b,c); 
      } 
     } 
     else { 
      if (typeof(pCallback.onNotLoggedIn) == 'function') { 
       pCallback.onNotLoggedIn(a,b,c); 
      } 
     } 
} 

function lefinish(a, b, c) { 
    alert(b); 
} 

// Calling install 
install(pageId, appId, app_num, com_id, siteurl, { 
    'onConnect': function(a,b,c) {}, //Anonymous function 
    'onNoAuth': lefinish //A predefined function 
    // does not produce an error if onNotLoggedIn is not defined because of typeof(). 
}) 
관련 문제