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

最佳答案

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

因此,您现在拥有的位置:

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

09-25 19:02