Javascript 使FB.api()调用同步

Javascript 使FB.api()调用同步,javascript,facebook,asynchronous,facebook-graph-api,synchronous,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.resp

我正在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.
  });
}
是否可以返回响应,或者我们是否可以进行同步调用。我尝试了很多方法,但都没有成功


请提供建议。

如果你仔细想想,你并不真的想让它同步。Javascript本质上是单线程的,要使某些东西是异步同步的,就需要“冻结”线程,直到异步调用返回

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


重新设计您的代码以使用异步特性,而不是对抗它。同时,您将创建更好的应用程序,拥有更快乐的用户,并成为更好的编码员。

我的解决方案是进行递归调用,直到我从FB.api获得所需的内容为止。

如果您需要使用FB.api的适当解决方案,您可能希望在for循环迭代中调用FB.api。请阅读我在其他地方评论的另一个问题

中给出的答案,如果您想在成功响应后打开弹出窗口,则进行同步调用非常有用,因为浏览器通常会阻止不是用户直接操作结果的弹出窗口

您可以通过使用JavaScript(或以下示例中的jQuery)手动调用OpenGraphAPI,而不是使用FacebookJSSDK来实现这一点

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');
        }
    }
});

“啊,”我最初想。我讨厌这样的答案,它不能回答问题,而只是说“做得适当”,几乎没有指导。但我很高兴我接受了你的建议,它解决了其他一些问题。如果这对其他人有帮助,我必须使调用函数也异步,并中断一些代码,以便在操作完成后在回调中调用。我不希望这个答案被接受。我知道这不推荐,但我还是想在第一次打电话时就这么做。重新设计我的代码将花费永远的时间。我只需要进行一个特定的fb.api调用(这是一个非常快速的调用)同步。我已经分析了这个调用,它非常快。有些情况下,您确实需要同步api,比如我正在创建一个jquery验证规则,我需要查询graph api的结果,所有这些都是为了知道它是否有效。有没有关于如何重新设计代码以满足此要求的建议。这不是对实际问题的回答。2.需要这样做的一个例子是,在处理由于在不同线程中打开窗口而导致的弹出窗口阻塞时…你没有抓住要点-不可能将异步调用转换为同步调用,句号。-1这是错误的-你阻塞了踏板,最终会得到堆栈溢出异常..天哪,我们必须看到的答案是:Djust看到了这篇文章,它很有帮助,但更新的url必须以“”开头