Problema variável ao usar chamadas assíncronas FB.api com jQuery.when () [closed]

0

Tentando obter dados de várias chamadas para o FB em uma matriz e operando com elas quando estiverem prontas. Infelizmente. O script aguarda resposta, mas de qualquer forma não posso acessá-lo mais tarde.

    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"
    });

Talvez $ .quando de alguma forma não funciona com várias chamadas FB.api ()? Alguma idéia do que está errado?

    
por Ilja Polivanovas 11.02.2015 / 19:24

1 resposta

1

Existem vários erros aqui:

1) Os arrays não devem ser iterados assim:

for(i in ['...','...'])

Quando você faz isso, i será o índice na matriz, não no item da matriz. E, iterar-se-á através das propriedades do objeto, que por vezes podem ser mais do que apenas elementos de matriz. Você deve iterar elementos de matriz com:

for (var i = 0; i < array.length; i++) {
    // process array[i]
}

ou com .forEach() :

array.forEach(function(item, index) {
    // process item here
});

2) Eu mesmo não sei a API do FB, mas não vejo nenhuma documentação que FB.api() retorne uma promessa. $.when() só funciona com promessas.

3) Quando você está acumulando itens em friendsRequest , está criando um objeto, não uma matriz. Assumindo que friend.id é uma string, friendsRequest[friend.id] define a propriedade de um objeto, não um elemento de matriz.

4) Se você quiser usar uma matriz real com $.when() (depois de ter corrigido outras coisas para realmente ter uma matriz), $.when() espera ser chamado assim:

$.when(p1, p2, p3, p4)

onde p1 ... p4 são promessas. Portanto, se você tiver uma série de promessas, poderá chamar $.when() da maneira apropriada ao fazer isso:

$.when.apply($, arrayOfPromises)
    
por jfriend00 11.02.2015 / 19:53