2012-02-21 4 views
-1

Я пытаюсь определить через некоторый флаг, когда эта асинхронная функция заканчивается.Как узнать, когда заканчивается асинхронная функция JavaScript?

Это, как я называю функцию:

// 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

Возможный дубликат [Есть ли способ определить, успешно ли загружен SDK для Javascript Facebook?] (Http://facebook.stackoverflow.com/questions/5334977/is-there-a-way-to-detect-if-the -facebook-Javascript-СДК-загружен-успешно) – 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

Во-первых, необходимо добавить дополнительный параметров вашей функции, которая получит функциональный объект

установки: функцию (PageId, 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(). 
}) 
Смежные вопросы