我有以下JavaScript代码,它可以获取当前登录用户相册的所有id:
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]);
}
我的问题是,最后一行,警报不起作用。它是在填充数组的函数之外调用的,但这应该很好,因为数组是在顶部声明的(var albums=new array),对吧?我觉得房间里有头大象,我看不见。你看到什么不对吗?我不知道这是fql问题还是JavaScript问题。
您没有异步思考;在传递给FB.api
的回调运行之前,不会填充数组,并且在此之前执行alert
。
将alert
放在回调函数中,您应该会得到预期的结果。
API是异步的。在结果实际可用之前,您将无法看到结果。
如果您将警报移动到响应函数内部的,就像for
循环之后一样,情况应该会更好。
这是一个JavaScript问题。具体来说,这是一个理解异步事件和回调的问题。
如果你看看你的程序结构,很明显你是:
var albums= new Array(); // creating an Array
FB.api('/me', function() {}); // launching an API request
alert(albums[1]); // accessing the second album
然而,并不总是清楚的是API请求是异步的。当您调用FB.api()
时,API请求被启动,但不会立即完成。这就是FB.api()
的第二个参数的作用;它允许您指定一个函数(即代码块),该函数的执行将延迟到稍后API请求完成为止。
您只能在回调函数中使用API调用的结果。当然,albums
数组已经声明;但直到一段时间后被回调填充,它的长度是0
;而你正试图访问第二个元素。