这听起来像一个奇怪的标题,可能没有说得太好。但这是问题。回调代码似乎在回调实际调用之前运行
我有了这个方法被称为:
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秒的延迟时,我的回调中的这些线是如何被调用的呢?
有你尝试围绕你的settimeout的js参数引用?我只见过它作为字符串传递。有点像:setTimeout(“alert('hello')”,5000); – Jage 2010-08-31 21:23:24
@Jage这实际上并不是最好的办法。通过引用一个函数更好更灵活。 – Pointy 2010-08-31 21:28:51
我不明白为什么var引用会更有效率,是的,应该是引号,很好的捕获。 – PositiveGuy 2010-08-31 21:36:58