等待循环完成,facebook API?

时间:2014-11-17 21:12:58

标签: javascript facebook-graph-api backbone.js

有没有办法改善我推动物体的方式?

我的问题是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)

3 个答案:

答案 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);
});