尝试将多次调用 FB 的数据放入一个数组中,并在准备就绪时对其进行操作。不幸的是。脚本等待响应,但无论如何我以后都无法访问它。
var xxx = 0; // Counter to check
var friendsRequest = []; // Array to catch all calls and execute the code when all responses are back
var friends = ['...','...']; // array of friend id's
for (var i = 0; i < friends.length; i++) {
var friend = friends[i]; // Go through number of FB friends (doesn't matter)
// Here we save all calls to wait for result
friendsRequest[friend] = FB.api('/' + friend + '/picture?redirect=0&height=64&type=square&width=64', function(response) {
xxx++; // Try to increment the counter
console.log(xxx); // Works fine.
});
}
// Execute the code when all data collected.
// It executes correctly __after__ last FB.api() async call ends
$.when(friendsRequest).then(function(){
console.log(xxx); // But here we have always "0"
});
也许 $.when 无法与多个 FB.api() 调用配合使用?您知道哪里出了问题吗?
答案1
这里有多个错误:
1)数组不应该像这样迭代:
for(i in ['...','...'])
当您执行此操作时,i
将是数组中的索引,而不是数组中的项。并且,它将迭代对象的属性,有时这些属性可能不仅仅是数组元素。您应该使用以下任一方法迭代数组元素:
for (var i = 0; i < array.length; i++) {
// process array[i]
}
或者.forEach()
:
array.forEach(function(item, index) {
// process item here
});
2)我自己不知道 FB api,但我没有看到任何FB.api()
返回承诺的文档。 $.when()
仅适用于承诺。
3)当您在 中累积项目时friendsRequest
,您正在构建一个对象,而不是一个数组。假设friend.id
是一个字符串,friendsRequest[friend.id]
则设置对象的属性,而不是数组元素。
4)如果您想要使用实际数组$.when()
(在您修复其他内容以实际拥有一个数组之后),$.when()
则预计会像这样调用:
$.when(p1, p2, p3, p4)
其中 p1 ... p4 是承诺。因此,如果您有一个承诺数组,那么您可以$.when()
通过执行以下操作以适当的方式调用:
$.when.apply($, arrayOfPromises)