7

我正在FB javascript SDK上创建fQuery API。直到现在一切正常,但我现在被困在FB.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. 
    }); 
} 

是否可以返回响应或是否可以使其同步呼叫?我尝试了许多方法解决问题,但无法取得成功。

请提供建议。

回答

8

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

即使你能做到这一点,你也不想相信我。

重新设计您的代码以处理异步性质,而不是与之对抗。您将创建更好的应用程序,让用户更快乐,同时成为更好的编码器。

+6

“哎呀,”我本来以为。我讨厌这样的回答并不回答这个问题,只是在没有多少指导的情况下说“做得妥善”。但我很高兴我接受了你的建议,解决了一些其他问题。如果它可以帮助其他人,我必须使调用函数也是异步的,并且在操作完成后中断一些在回调中调用的代码。 – changokun 2011-05-03 13:08:34

+0

我并不期待这个答案是被接受的。我知道它不被推荐,但仍然,我很想在第一次通话时这样做。重新设计我的代码将需要永久。我只需要使一个特定的fb.api调用(即非常快速的调用)同步。我已经介绍过这个电话,而且速度非常快。 – 2011-08-15 19:40:19

+0

有些情况下您确实需要同步API,比如我正在创建一个jQuery验证规则,并且我需要查询图api的结果以确定它是否有效。有关如何重新设计代码以满足此要求的任何建议? – 2012-03-12 04:38:07

-5

我的解决办法是让一个递归调用,直到我得到了我从FB.api

+5

-1这是错误的 - 你阻止了,最终会得到一个堆栈溢出异常。 – 2011-07-21 18:02:31

+0

哦,上帝,我们必须看到的答案:D – ErwinGO 2014-08-27 06:20:04

-1

你可能想打电话FB.api在for循环迭代需要的,如果这是你需要它的妥善解决的情况下其中存在使用Closures。请阅读我的回答here,在另一个问题中给出

4

正如其他地方所评论的,如果您想在成功响应后打开弹出窗口,因为浏览器通常会阻止不是直接结果的弹出窗口用户操作。

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

例如上传通过开放图形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'); 
     } 
    } 
}); 
+0

刚刚看到这篇文章,它有帮助,但更新的网址必须开始像“https://graph.facebook.com/v2.5/” – chuycepeda 2015-12-19 23:39:34