[英]Wait for loop to finish, facebook API?
有没有办法改善我推物体的方式?
我的问题是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)
为每个成员再次调用API并不是一个好主意。 这非常慢,您可能会达到API限制。 您应该考虑使用嵌套查询 :
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”的范围,并使循环速度更快。
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)
});
}
});
facebook方法是异步的。 利用回调或Promise。 切勿使用超时来假设何时准备就绪。
回调示例:
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);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.