2010-08-31 57 views
3

这听起来像一个奇怪的标题,可能没有说得太好。但这是问题。回调代码似乎在回调实际调用之前运行

我有了这个方法被称为:

function BindFacebookAlbumAndPhotoData() 
{ 
    GetAllFacebookAlbums(userID, accessToken, function(aAlbums) 
    { 
     if (aAlbums === null || aAlbums === undefined) 
     { 
      // TODO: Need to handle this 
      return; 
     } 

     var defaultAlbumID = aAlbums[0].id; 

     BindFacebookAlbumDropdownList(aAlbums, defaultAlbumID); 

     BindFacebookThumbnails(userID, accessToken, defaultAlbumID, photosContainerDivID); 

     SetSelectDefaultOption(defaultAlbumID); 
    }); 
} 

所以这里的GetAllFacebookAlbums方法:

function GetAllFacebookAlbums(userID, accessToken, callbackFunction) 
{ 
    var aAlbums = []; 
    var uri = "/" + userID + "/albums?access_token=" + accessToken; 

    // this is an async call so code after this will fire at the same time 
    FB.api(uri, function(response) 
    { 
     // check for a valid response 
     if (!response || response.error) 
     { 
      callbackFunction(albums); 
     } 

     for (var i = 0, l = response.data.length; i < l; i++) 
     { 
      //do whatever 
     } 
    }); 

    // wait for the FB.api call to run a bit before calling code below 
    window.setTimeout(callbackFunction(aAlbums), 5000); 
} 

发生了什么事是被称为该行之前的setTimeout看来:

var defaultAlbumID = aAlbums[0].id; 

我把那个超时放在那里的所有原因是我可以等待FB.ap我打电话结束。然后在知道我有数据后调用回调。那么当我在调用回调之前肯定没有看到5秒的延迟时,我的回调中的这些线是如何被调用的呢?

+0

有你尝试围绕你的settimeout的js参数引用?我只见过它作为字符串传递。有点像:setTimeout(“alert('hello')”,5000); – Jage 2010-08-31 21:23:24

+0

@Jage这实际上并不是最好的办法。通过引用一个函数更好更灵活。 – Pointy 2010-08-31 21:28:51

+0

我不明白为什么var引用会更有效率,是的,应该是引号,很好的捕获。 – PositiveGuy 2010-08-31 21:36:58

回答

5

这条线就在这里:

window.setTimeout(callbackFunction(aAlbums), 5000); 

你调用该函数正确的,在该setTimeout()通话。把它换成另一种功能:

window.setTimeout(function() { callbackFunction(aAlbums); }, 5000); 

现在,这就是说,整个设置没有多大意义。您已经获得了代码,只要数据准备就绪,您将知道该代码将被称为。这是Facebook API回调中的代码。为什么不直接从那里调用你的“回调函数”呢?

+0

斑点... – 2010-08-31 21:20:52

+0

“您已经获得了代码,只要数据准备就绪,您就会知道该代码将被调用。”不必要。 FB.api调用是一个异步调用,所以我的回调函数(callbackFunction(aAlbums))在调用FB.api调用的同时被调用。 – PositiveGuy 2010-08-31 21:39:10

+0

“这是Facebook API回调中的代码,为什么不直接从那里调用”callbackFunction“?”。我已经在过去尝试过,并且有了各种各样的地狱。因为如果你这样做了,那么FB.api的回调从FB.api回调本身调用最后一次回调到callbackFunction(aAlbums)的时候将不会被命中/运行 – PositiveGuy 2010-08-31 21:40:27

0

这是我的理解,你应该做的

[/code` window.setTimeout(callbackFunction, 5000, aAlbums);`] 

代替:

[/code`window.setTimeout(function() { callbackFunction(aAlbums); }, 5000);`] 

,我真的相信既会工作,但第一似乎更容易读,写和理解