Problema de bucle de consultas de Facebook
Frecuentes
Visto 133 veces
1
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.
3 Respuestas
1
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
1
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
1
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á:
var albums= new Array(); // creating an Array
FB.api('/me', function() {}); // launching an API request
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 javascript facebook facebook-fql or haz tu propia pregunta.