javascript - 代码只有在我在代码爆炸之前发出警报时才有效?

标签 javascript

这对我来说真是太奇怪了。所以如果我不

    function BindAlbumAndPhotoData()
    {
        // Get an array of all the user's Albums
        var aAlbums = GetAllAlbums(userID, token);

        alert("aAlbums: " + aAlbums);
        if (aAlbums == null || aAlbums == "undefined")
            return;

        // Set the default albumID
        var defaultAlbumID = aAlbums[0].id;

    };

所以我在行 var defaultAlbumID = aAlbums[0].id; 上得到了一个未定义的错误如果我不取消注释 alert("aAlbums: "+ aAlbums);

这是什么鬼?如果我注释掉 alert("aAlbums: "+ aAlbums);然后我得到一个未定义的 var defaultAlbumID = aAlbums[0].id;

这太奇怪了。我整晚都在努力弄清楚为什么我一直在为 aAlbum[0] 获取未定义的信息,并且一旦我添加回以前在其上方设置的警报,一切都很好......对我来说毫无意义.

这是 GetAllAlbums 的完整代码:

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

    alert("uri: " + uri);

    FB.api(uri, function (response) 
    {
        // check for a valid response
        if (!response || response.error) 
        {
            alert("error occured");
            return;
        }

        for (var i = 0, l = response.data.length; i < l; i++) 
        {
            alert("Album #: " + i + "\r\n" +
                  "response.data[i].id: " + response.data[i].id + "\r\n" +
                  "response.data[i].name: " + response.data[i].name + "\r\n" +
                  "response.data[i].count: " + response.data[i].count + "\r\n" +
                  "response.data[i].link: " + response.data[i].link
                  );

            aAlbums[i] = new Album(
                                                    response.data[i].id,
                                                    response.data[i].name,
                                                    response.data[i].count,
                                                    response.data[i].link
                                                   );

            alert("aAlbums[" + i + "].id : " + aAlbums[i].id);
        }
    });

    return aAlbums;
}

所以我不会返回数组,直到我点击 FB.api 异步调用的回调,所以我看不到我的 defaultAlbumID = aAlbums[0].id;在我返回有效的数据数组之前,代码行正在执行。当我发出警报时,很明显它在到达我的行 defaultAlbumID = aAlbums[0].id; 之前延迟了。导致它我猜幸运的是有数据因为异步 FB.api 调用已经完成但是我再次不明白当我等待调用然后继续并将数组返回到aAlbums 在我的 BindAlbumAndPhotoData() 方法中。

更新 #3

            function BindAlbumAndPhotoData()
            {
                GetAllAlbums(userID, accessToken, function (aAlbums) 
                {
                    alert("we're back and should have data");

                    if (aAlbums === null || aAlbums === undefined) {
                        alert("array is empty");
                        return false;
                    }

                    var defaultAlbumID = aAlbums[0].id;

                    // Set the default albumID
                    var defaultAlbumID = aAlbums[0].id;

                    // Bind the album dropdown
                    alert(" defaultAlbumID: " + defaultAlbumID);

                 });
            };


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

    FB.api(uri, function (response) 
    {
        // check for a valid response
        if (!response || response.error) 
        {
            alert("error occured");
            return;
        }

        for (var i = 0, l = response.data.length; i < l; i++) 
        {
            alert("Album #: " + i + "\r\n" +
                  "response.data[i].id: " + response.data[i].id + "\r\n" +
                  "response.data[i].name: " + response.data[i].name + "\r\n" +
                  "response.data[i].count: " + response.data[i].count + "\r\n" +
                  "response.data[i].link: " + response.data[i].link
                  );

            aAlbums[i] = new Album(
                                                    response.data[i].id,
                                                    response.data[i].name,
                                                    response.data[i].count,
                                                    response.data[i].link
                                                   );

            alert("aAlbums[" + i + "].id : " + aAlbums[i].id);
        }

        // pass the array back to the callback function sent as a param to the GetAllAlbums method here
        callbackFunctionSuccess(aAlbums); 
    });
}

它没有在回调中触发我的警报。我一定还是在这里做错了什么。

更新 #4 - 由于某种原因,它现在没有触发我的 FB.api 回调。

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

    alert("uri: " + uri);

    FB.api(uri, function (response) 
    {
        // check for a valid response
        if (!response || response.error) 
        {
            alert("error occured");
            return;
        }

        for (var i = 0, l = response.data.length; i < l; i++) {
            alert("Album #: " + i + "\r\n" +
                  "response.data[i].id: " + response.data[i].id + "\r\n" +
                  "response.data[i].name: " + response.data[i].name + "\r\n" +
                  "response.data[i].count: " + response.data[i].count + "\r\n" +
                  "response.data[i].link: " + response.data[i].link
                  );

            aAlbums[i] = new Album(
                                                    response.data[i].id,
                                                    response.data[i].name,
                                                    response.data[i].count,
                                                    response.data[i].link
                                                   );

            alert("aAlbums[" + i + "].id : " + aAlbums[i].id);
        }

        alert("about to pass back the array to the callback function");
        // pass the array back to the callback function sent as a param to the GetAllAlbums method here
        callbackFunctionSuccess(aAlbums);
    });
}

最佳答案

function BindAlbumAndPhotoData()
{
    // Get an array of all the user's Albums
    GetAllAlbums(userID, token, function(aAlbums){

        // Set the default albumID
        var defaultAlbumID = aAlbums[0].id;

    });

};

然后在 GetAllAlbums 函数中,当您取回数据时调用成功函数

//********* 休息后 *******//

针对更新后的问题:FB API 大部分是异步的,在等待期间会继续执行其他代码。所以使用你的代码,我所做的就是传入函数,然后在最后调用你传递给它的函数

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

alert("uri: " + uri);

FB.api(uri, function (response) 
{
    // check for a valid response
    if (!response || response.error) 
    {
        alert("error occured");
        return;
    }

    for (var i = 0, l = response.data.length; i < l; i++) 
    {
        alert("Album #: " + i + "\r\n" +
              "response.data[i].id: " + response.data[i].id + "\r\n" +
              "response.data[i].name: " + response.data[i].name + "\r\n" +
              "response.data[i].count: " + response.data[i].count + "\r\n" +
              "response.data[i].link: " + response.data[i].link
              );

        aAlbums[i] = new Album(
                                                response.data[i].id,
                                                response.data[i].name,
                                                response.data[i].count,
                                                response.data[i].link
                                               );

        alert("aAlbums[" + i + "].id : " + aAlbums[i].id);



    }

    funcSuccess(aAlbums);
});

关于javascript - 代码只有在我在代码爆炸之前发出警报时才有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3340710/

相关文章:

javascript - 为什么无限滚动中的 wrapAll 有很多 div?

c# - 如何在服务器端关闭radwindow并刷新父页面

javascript - 在 mouseEnter 上制作扩展文本

javascript - Observables - Angular - .map 不起作用,但 .subscribe 起作用

php - 在 javascript/php/html 中选择第一个下拉列表后更新第二个下拉列表

javascript - 为什么IE8的一些内置函数不是Function的实例?

javascript - 文本占据了输入字段的哪一部分?

javascript - 我怎样才能避免按钮点击两次的重复请求

javascript - 响应式图像 slider 特殊情况

javascript - 如何识别移动设备中的地址栏?