回调代码似乎在实际调用回调之前运行

时间:2010-08-31 21:13:31

标签: javascript

这听起来像一个奇怪的标题,可能没说得太好。但这是问题所在。

我已经调用了这个方法:

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.api调用完成。然后在我知道有数据后调用回调。那么,当我在调用回调之前肯定没有看到5秒的延迟时,我的回调中的那些行是如何调用的?

2 个答案:

答案 0 :(得分:5)

这一行就在这里:

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

您正在setTimeout()来电中调用该功能。用另一个函数包装它:

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

现在,说,整个设置并没有多大意义。您已经将代码放在一个数据准备好后就会被称为的地方。这是您获得的Facebook API回调中的代码。为什么不从那里调用你的“callbackFunction”?

答案 1 :(得分:0)

我的理解是你应该做的

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

而不是:

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

我相信两者都会起作用,但第一件似乎更容易阅读,写作和理解