0

我在 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
  });
}
4

3 回答 3

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);
    }
  });
}
于 2013-01-09T15:06:18.187 回答
0

getMutualFriends 正在自己进行异步调用(通过调用 FB.api),因此在完成之前您无法打印 mutex加工)。

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

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

祝你好运,

于 2013-01-09T15:02:08.277 回答
0

您可以使用一个while 循环来等待mutualFriendsList.length 等于friendsList.length。这意味着所有 ajax 函数的返回函数都已实现。

它看起来像:

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

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

有点不雅,但它应该工作

于 2013-01-09T15:06:09.620 回答