【问题标题】:Code only works if I alert out before the code that's bombing out?代码只有在我在代码爆炸之前发出警报时才有效?
【发布时间】:2010-07-28 23:32:52
【问题描述】:

这对我来说太奇怪了。所以如果我不这样做

    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; 行上得到一个未定义的错误。如果我不取消注释警报("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);
    });
}

【问题讨论】:

  • 你可能在这里做 ajax (GetAllAlbums(userID, token);),不是吗?
  • GetAllAlbums(userID, token); 是做什么的?
  • 是的...但我还是不明白。
  • GetAllAlbums 调用 JS SDK ajax 来获取专辑并返回自定义专辑对象数组
  • 是的,这是一个典型的迹象,表明您的脚本正在尝试处理尚未(完全)加载的内容。

标签: javascript


【解决方案1】:
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);
});

}

【讨论】:

  • 我正在使用 Facebook SDK 进行 JS ajax 调用。
  • 然后代替函数中的 jquery 位,从我看到的 FB 示例中我看到你想要类似 ajax.ondone = function(data) { funcSuccess(data); };我将它包装在另一个函数中的唯一原因是它让您有空间进行一些质量控制(如果数据!=null)等
  • 杰米,谢谢。在上面查看我对线程的更新...查看我的 GetAllAlbums 函数。
  • 所以现在我已经向您展示了我的 GetAllAlbums() 是如何工作的,如果您的示例使用 GetAllAlbums(userID, token, function(aAlbums){...我正在使用 FB.api 的回调来等待响应。我不明白你的语法我猜想还是 funcSuccess 无论如何你是如何将它作为参数添加到那里的。
  • 但是什么是 url:"thisurl",当 FB.api 发送请求时,不是 jQuery ajax 函数?
【解决方案2】:

您的函数GetAllAlbums() 是否在执行一些HTTP 请求?如果是这样,那么您需要使该调用同步,或者您需要将代码放入一个函数并将其作为回调传递给 Ajax 请求。

【讨论】:

  • 是的,已经在 FB.api 的回调中这样做了。查看我更新的帖子。
【解决方案3】:

尝试三个等号而不是两个等号,并且...返回 false 而不是什么都没有。

if (aAlbums === null || aAlbums === undefined)
            return false;

另外,undefined 不需要用引号引起来,否则只会被认为是一个值为“undefined”的字符串

补充一点,在决定从中返回键之前,最好还检查 aAlbums 是否实际上是一个数组。

if (   aAlbums === null 
    || aAlbums === undefined
    || (typeof(aAlbums)=='object'&& !(aAlbums instanceof Array))
    } return false;

【讨论】:

  • 如你所说,它是undefined 而不是"undefined"
  • 这并没有什么不同: if ( aAlbums === null || aAlbums === undefined || (typeof(aAlbums)=='object'&& !(aAlbums instanceof Array)) )返回假;
  • 请查看我对主线程的更新。添加了 GetAllAlbums 函数以向您展示其工作原理。
【解决方案4】:

尝试像这样修改您的条件:

  if (typeof aAlbums == 'undefined')
      return;

还要确保aAlbums 有值并且是一个数组:

alert(aAlbums.length);

或者:

for(var i = 0; i < aAlbums.length; i++)
{
  alert(aAlbums[i].id);
}

【讨论】:

  • 好吧,尽管我知道数组中有值,但我得到的长度为零......很奇怪。
  • if (typeof aAlbums == 'undefined') return;不起作用或有任何区别..刚刚测试过。
  • @coffeeaddict:如果它的长度为 0,那么它没有填充数据,而不是数组。确保函数 GetAllAlbums 工作正常。
  • 它将返回零,因为您正在等待执行该脚本行时的 ajax 数据...对计算机来说太慢,对您的眼睛来说太快...这就是您看到的原因数据,但 JS 说它是未定义的......
  • 不,我是说不要使用引号,因为 undefined 已经是 Javascript 中的保留属性。如果您要使用引号,那么您假设在您的 GetAllAlbums 函数中,您实际上将字符串“未定义”分配给它的返回;你没有。三等号只是更严格的比较。
猜你喜欢
  • 2020-09-29
  • 2023-03-07
  • 2018-04-05
  • 2013-05-10
  • 2020-02-09
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
相关资源
最近更新 更多