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