Problema de bucle de consultas de Facebook

Tengo el siguiente código JavaScript que obtiene todas las identificaciones de los álbumes del usuario que está conectado actualmente:

function fqlQuery(){
            showLoader(true);
            var albums= new Array();
            FB.api('/me', function(response) {
                var query =  FB.Data.query('SELECT aid, owner, name, object_id FROM album WHERE owner={0}', response.id);
                var aantal_albums=0;        
                var photos= new Array();
                query.wait(function(rows) {
                aantal_albums= rows.length;     
                    for(var i=0; i<aantal_albums;i++){

                     albums[i]= rows[i].aid;
                    }
                 });
            });
            alert(albums[1]);       
        }

Mi problema es que, en la última línea, la alerta no funciona. Se llama fuera de la función en la que se llena la matriz, pero eso debería estar bien, porque la matriz se declara en la parte superior (var albums= new Array), ¿no? Siento que hay un elefante en la habitación y no puedo verlo. ¿Ves algo malo? No sé si se trata de un problema de fql o de JavaScript.

preguntado el 09 de marzo de 12 a las 15:03

3 Respuestas

No estás pensando de forma asíncrona; la matriz no se completará hasta que la devolución de llamada que pasó a FB.api corre, y tu alert se ejecuta antes de eso.

Coloque el alert dentro de su función de devolución de llamada y debería obtener los resultados que espera.

respondido 09 mar '12, 15:03

La API es asíncrona. No podrá ver los resultados hasta que los resultados estén realmente disponibles.

Si mueve su alerta a dentro la función de respuesta, justo después de eso for bucle, las cosas deberían funcionar mejor.

respondido 09 mar '12, 15:03

Este es un problema de JavaScript. Específicamente, es un problema con su comprensión de los eventos asincrónicos y las devoluciones de llamada.

Si observa la estructura de su programa, está claro que está:

  1. var albums= new Array(); // creating an Array
  2. FB.api('/me', function() {}); // launching an API request
  3. alert(albums[1]); // accessing the second album

Sin embargo, lo que no siempre está claro es que la solicitud de la API sea asíncrona. La solicitud de la API es lanzado cuando usted llama FB.api(), pero no lo es terminado inmediatamente. Esto es lo que el segundo parámetro de FB.api() es para; le permite especificar una función (es decir, un bloque de código), cuya ejecución se retrasa hasta que se completa la solicitud de la API algún tiempo después.

Solo puede usar los resultados de su llamada API en la función de devolución de llamada. Claro, el albums se ha declarado la matriz; pero hasta que se rellena con la devolución de llamada algún tiempo después, su longitud es 0; y estás intentando acceder al segundo elemento.

respondido 09 mar '12, 15:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.