Facebook Api Call Ready

时间:2013-01-09 14:51:28

标签: javascript facebook facebook-graph-api

我在Javascript中遇到同步问题。代码如下。当我打电话给共同的朋友时,虽然我的功能仍在通过API回调填充数组,但"Quite a bunch: 0"的打印在打印之前发生了 - console.log(friendID +" -> " + mutualfriends.data.length);

我知道这必须是回调/异步问题,但我不知道如何处理它。我正在填充阵列是有原因的 - 需要为下一部分填充它。

代码:

function getMutualFriends(friendID)
{
  //console.log(response.data[i].id);
  try{

           FB.api('/me/mutualfriends/'+friendID, function(mutualfriends) {
             //console.log(mutualfriends);
             //console.log(mutualfriends.data.length);

             console.log(friendID +" -> " + mutualfriends.data.length);
             mutualFriendsList.push([friendID,mutualfriends.data.length]);
           });
    }
  catch(err){
    console.log('error caught: ' +err);
  }

}

function getFriendsList()
{
  FB.getLoginStatus(function(response){   
    FB.api('/me/friends', function(response) {

         for(i=0; i<response.data.length;i++)
         {
           var friendID = response.data[i].id;
           console.log(friendID);
           friendsList.push(friendID);
         }

         console.log('Interesting, we gathered: '+friendsList.length+' friends,');

         console.log('lets check mutual friends now');

        for(j=0; j<friendsList.length;j++)
        {
          getMutualFriends(friendsList[j]);
        }

        console.log('Quite a bunch: ' + mutualFriendsList.length);

        });//friends
  });
}

3 个答案:

答案 0 :(得分:3)

您可能希望将“后置条件”代码转换为回调。

所以你现在所拥有的地方:

for(j=0; j<friendsList.length;j++)
{
  getMutualFriends(friendsList[j]);
}

console.log('Quite a bunch: ' + mutualFriendsList.length);

你会想要这样的东西:

for(j=0; j<friendsList.length;j++)
{
  getMutualFriends(friendsList[j], function(mutualFriendsList) {
    console.log('Quite a bunch: ' + mutualFriendsList.length);
  });
}

当你这样设置时,你的getMutualFriends函数可以在得到结果后调用回调函数:

function getMutualFriends(friendID, callback)
{
   FB.api('/me/mutualfriends/'+friendID, function(mutualfriends) {
     mutualFriendsList.push([friendID,mutualfriends.data.length]);
     callback(mutualFriendsList);
   });
}

每次调用getMutualFriends时,都会执行一次回调。如果您希望回调仅针对所有朋友触发一次,则需要进一步扩展该概念。

<强>更新

您可以将上述“每个朋友”的回调与@ RGDev的条件结合起来检测最后一位朋友:

for(j=0; j<friendsList.length;j++)
{
  getMutualFriends(friendsList[j], function(mutualFriendsList) {
    if (mutualFriendsList.length == friendsList.length) {
      console.log('Quite a bunch: ' + mutualFriendsList.length);
    }
  });
}

答案 1 :(得分:0)

getMutualFriends正在自己进行异步调用(通过调用FB.api),所以你不能打印mutualFriendsList直到它完成(实际上,你正在调用getMutualFiends,所以你的mutualFriendsList在所有这些之前都不准确完成了他们的异步处理)。

你不能依赖那个集合来实现异步吗?我不知道你在做什么,但也许(如果你是通过示例在屏幕上绘制它)你可以在每次FB.api回调时发出该组件的重绘('/ me / mutualfriends /' + friendID,...)已完成。

我过去遇到过类似的问题,我通过使用backbone.js'集合而不是简单的javascript数组来解决它。然后我将监听器绑定到集合的add事件,并在每次添加对象时打印朋友的数量。

祝你好运,

答案 2 :(得分:0)

您可以使用while循环等待,直到mutualFriendsList.length等于friendsList.length。这意味着所有的ajax函数返回函数都已完成。

看起来像是:

while(mutualFriendsList.length != friendsList.length)
{
console.log("Still Waiting");

 }
console.log('done')
// do your data processing 

有点不优雅,但应该有效