使FB.api()调用同步

时间:2011-03-09 12:14:36

标签: javascript facebook asynchronous facebook-graph-api synchronous

我在FB javascript SDK上创建了fQuery API。到目前为止一切正常,但我现在卡在FB.api电话中。

实际上,我正在尝试使用FB.api函数加载facebook用户对象,即“/ me”。

function somefunc() {
  var r = fQuery.load(selector);  //selector = "me"
  return r;
}


fQuery.load = function( selector )  {
  fQuery.fn.response = "";

  return FB.api( "/" + selector, function (response) {
    // we get response here.
  });
}

是否可以返回响应,或者我们可以进行同步呼叫。我已经尝试了很多方法来解决但却无法获得成功。

请提供建议。

4 个答案:

答案 0 :(得分:8)

如果你考虑一下,你真的不想让它同步。 Javascript本质上是单线程的,使得异步同步的东西会涉及“冻结”线程,直到异步调用返回。

即使你能做到,也不要相信我。

重新设计代码以使用异步特性而不是与之抗争。你将创造更好的应用程序,拥有更快乐的用户,同时成为更好的编码器。

答案 1 :(得分:4)

如其他地方所述,如果您想在成功响应后打开弹出窗口,进行同步调用很有用,因为浏览器通常会阻止不是直接用户操作的弹出窗口。

您可以通过使用JavaScript手动调用Open Graph API(或按照以下示例使用jQuery)而不是使用Facebook JS SDK来执行此操作。

e.g。通过Open Graph API上传照片,然后提示用户使用弹出窗口将其添加为个人资料图片,而不会阻止弹出窗口:

$.ajax({
    type: 'POST',
    url: 'https://graph.facebook.com/me/photos',
    async: false,
    data: {
        access_token: '[accessToken]',//received via response.authResponse.accessToken after login
        url: '[imageUrl]'
    },
    success: function(response) {
        if (response && !response.error) {
            window.open('http://www.facebook.com/photo.php?fbid=' + response.id + '&makeprofile=1');
        }
    }
});

答案 2 :(得分:-1)

你可能想在for循环迭代中调用FB.api,如果是这种情况你需要使用Closures时存在的正确解决方案。请阅读我在另一个问题中给出的答案here

答案 3 :(得分:-5)

我的解决方案是进行递归调用,直到我从FB.api得到我需要的东西