我在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
});
}
答案 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
有点不优雅,但应该有效