我有一组Facebook用户(userList),我想将数组中每个用户的共同朋友的数量存储为属性(mfCount)。我已经检查过,如果我输入一个单独的用户,我会得到正确数量的共同朋友,但我不确定为什么我不能将这个值添加到数组中的每个用户?
function getfriends() {
FB.api('/me/friends', function(response) {
userList = userList.concat(response.data);
userCount = response.data.length;
for( i=0; i<response.data.length; i++) {
userId = response.data[i].id;
FB.api('/me/mutualfriends/'+userId+'/', function(response) {
userList[i].mfCount = response.data.length;
userCount--;
if(userCount === 0) { display_results();}
});
}
});
}
答案 0 :(得分:1)
看看下面的实现。 我把它分解成多个函数来分隔每一步。 当你处理循环和回调时,跟踪你的匿名函数的定义范围变得非常重要。
理论上,你可以像写作一样在一行中完成这一切...... ...但是当你越来越进入嵌套回调时,它变得非常非常混乱。
一种解决方案是使每个函数内的每个变量100%全局,以便只有i
需要一个封闭的引用。但这并不是很漂亮。
查看每个函数,并记下每个步骤调用的函数(或回调闭包)的参数。他们都需要(无论你是以这种方式分开,还是通过单线或其他方式封闭)。
以下对我来说很好,在Facebook开发人员沙箱中(第一次使用API) 这些日志对我有利,可以看到数据是如何发布的,并保持基本的堆栈跟踪。
var userList = [],
userCount = 0;
function getfriends () {
//console.log("getFriends");
var url = "/me/friends";
FB.api(url, function (response) {
if (response.error && response.error.message) { return false; }
userList = userList.concat(response.data);
userCount = response.data.length;
compareAllFriends();
});
}
function compareAllFriends () {
//console.log("compareAllFriends");
var i = 0, l = userCount, userID;
for (; i < l; i += 1) {
userID = userList[i].id;
compareFriendsWith (i, userID);
}
}
function compareFriendsWith (i, id) {
//console.log("compareFriendsWith", i, id);
var path = "/me/mutualfriends/",
url = path + id + "/";
FB.api(url, (function (i) {
return function (response) {
//console.log(i, response);
var numFriends = (response.data) ? response.data.length : 0;
setMutualFriends(i, numFriends);
userCount -= 1;
//console.log(userCount);
if (userCount === 0) {
display_results();
//console.log("DISPLAYING");
}
};
}(i)));
}
function setMutualFriends (i, friendcount) { userList[i].mfCount = friendcount; }