有没有办法改善我推动物体的方式?
我的问题是console.log(facebookPlayers)
为空,但是使用setTimeout它会显示新的对象数组。显然是因为它在对象数组填充之前被调用。
我打算用这个对象数组构建一个骨干集合,这是我从facebook API构建一个对象数组的初步想法。也许有一种更好的方法,或者也许这种方法有效,但如果确实如此,我需要想办法等待对象完全填充。
var facebookPlayers = [];
FB.api('/554870764588961/members/', function (response) {
for (i = 0; i < response.data.length; i++) {
FB.api(response.data[i].id+'/picture', function (response) {
facebookPlayers.push({key:response.data.url});
});
}
});
console.log(facebookPlayers)
答案 0 :(得分:2)
为每个成员再次调用API不是一个好主意。它非常慢,您可能会达到API限制。您应该考虑使用nested queries:
function getPlayers(callback) {
var facebookPlayers = [];
FB.api('/554870764588961?fields=members{id,name,picture}', function (response) {
for (var i = 0, count = response.data.length; i < count; i++) {
facebookPlayers.push({key:response.data[i].picture.data.url});
}
callback(facebookPlayers);
});
}
getPlayers(function (response) {
console.log(response);
});
未经过测试,但API调用适用于API Explorer,因此应该没问题。
编辑:我还修改了“i”的范围并使循环更快一些。
答案 1 :(得分:0)
console.log()在调用返回之前运行...将其放入回调中将允许您查看正在添加的内容。如下......
var facebookPlayers = [];
FB.api('/554870764588961/members/', function (response) {
for (i = 0; i < response.data.length; i++) {
FB.api(response.data[i].id+'/picture', function (response) {
facebookPlayers.push({key:response.data.url});
console.log(facebookPlayers)
});
}
});
答案 2 :(得分:0)
facebook方法是异步的。利用回调或承诺。 从不使用超时来假设什么时候准备就绪。
回调示例:
function doFacebookStuff(complete){
var facebookPlayers = [];
FB.api('/554870764588961/members/', function (response) {
for (i = 0; i < response.data.length; i++) {
FB.api(response.data[i].id+'/picture', function (response) {
facebookPlayers.push({key:response.data.url});
if(i === response.data.length-1)
complete(facebookPlayers);
// callback when all calls are done
});
}
});
}
doFacebookStuff(function(facebookPlayers){
console.log(facebookPlayers);
});