【问题标题】:Method callback not being hit方法回调未命中
【发布时间】:2023-03-08 08:42:01
【问题描述】:

我发誓这是昨晚工作的,这就是为什么我能够在凌晨 1 点上床睡觉的原因 ;)。我今天早上上班,现在它从来没有得到 FB.api 的回调。 FB.api 是一个异步 Facebook JS 调用......但不管昨晚它工作正常,我不认为这是一个 facebook 服务器(端点)问题。

            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;

                    alert(" defaultAlbumID: " + defaultAlbumID);

                 });
            };


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

    alert("uri: " + uri);

    FB.api(uri, function (response) 
    {
        alert("inside FB.api");
        // 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");

        callbackFunctionSuccess(aAlbums);
    });
}

所以它会到达 uri 的警报,但从未在 FB.api 回调中触发第一个警报。这意味着它永远不会触发 alert("inside FB.api");我不知道为什么。

更新

看起来我所有的 api 调用都被中止了。不确定什么会中止它(FB 服务器?):

alt text http://elbalazo.net/post/abortedcalls.jpg

更新 #2

Ok 看起来 abort 只是说 Http 请求已完成。如果我在 Firebug 中右键单击该中止行并选择“在新选项卡中打开”,它会显示 HttpResponse 数据......但我认为这是因为当我这样做时它会发送手动请求,就像你会复制并粘贴此请求 url手动进入浏览器...

另一方面,如果我右键单击该中止行并选择“复制响应标头”,我什么也得不到。此外,当我在 Chrome 中查看此内容时,我看到了请求标头,但没有看到任何响应标头。

所以仍然不明白为什么它没有进入回调然后如果我从 FB.api 调用中取回数据

更新 #3

好的,让这个再次工作。我在 FB.api 的回调中调用了回调方法。所以它被轰炸了。

function BindFacebookAlbumAndPhotoData()
{
GetAllFacebookAlbums(userID, accessToken, function(aAlbums) 
{

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

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

};

function GetAllAlbums(userID, accessToken, callbackFunctionSuccess) { var aAlbums = []; // 大批 var uri = "/" + 用户 ID + "/albums?access_token=" + accessToken;

//alert("uri: " + uri);

FB.api(uri, function (response) {
    alert("inside FB.api");

    // 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 FacebookAlbum(
                                        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");
    callbackFunctionSuccess(aAlbums);

}

【问题讨论】:

  • 你检查过 dom 检查器,看看 facebook 是否真的在发回响应的内容?
  • 不确定如何使用它...不过我已经安装了 firebug。
  • dom 检查器是插件吗?
  • 只要安装谷歌浏览器就可以了右上角,它会在你的 JS 中显示错误。
  • 不错,是的,我没怎么用过 Chrome,它也一直是 Firebug。让我试一试。

标签: javascript


【解决方案1】:

嗯,试试下面的

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

    alert("uri: " + uri);

    FB.api(uri,GetAllAlbumsCallback);
}

function GetAllAlbumsCallback(Data)
{
    alert("inside FB.api");
        // check for a valid response
        if (!Data || Data.error) 
        {
            return;
        }

        for (var i = 0, l = Data.data.length; i < l; i++)
        {
            aAlbums[i] = new Album(
                Data.data[i].id,
                Data.data[i].name,
                Data.data[i].count,
                Data.data[i].link
            );

            if (aAlbums === null || aAlbums === undefined)
            {
                alert("array is empty");
                return false;
            }
            var defaultAlbumID = aAlbums[0].id;
            alert(" defaultAlbumID: " + defaultAlbumID);
        }
}

尝试将回调与匿名分开,有时可能存在范围问题:/

将它们分开应该给它们一个全局范围,并且通常更不容易出错。

【讨论】:

  • 天哪,这太棒了!所以我看到发送的请求是graph.facebook.com/100001379631246/…
  • 是的,但至少我应该点击 FB.api 的回调,无论我是否已将回调函数引用传递给 GetAllAlbums...而我没有。
  • ok Firebug 显示该请求已中止。那一定是Facebook方面的东西
  • 您可以在屏幕截图中看到它显示 302 未找到,因此如果没有来自 fb 的数据,则不会调用回调。
  • 是的。我已经向他们提交了一张票。应该有数据返回,因为我在浏览器中测试了一个直接 url。发送的那个,它返回了数据。我只是没有收到来自 facebook 的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-31
  • 2011-03-01
  • 2017-05-03
相关资源
最近更新 更多