我有以下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。
答案 0 :(得分:1)
API是异步的。在结果实际可用之前,您将无法看到结果。
如果您将警报移至内部响应函数,就像在for
循环之后,事情应该会更好。
答案 1 :(得分:1)
这是一个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
;而你正试图访问第二个元素。
答案 2 :(得分:1)
你不是在考虑异步;在传递给FB.api
的回调运行之前,不会填充数组,并且在此之前执行alert
。
将alert
置于回调函数内部,您应该得到预期的结果。