Facebook查询循环问题

时间:2012-03-09 15:02:25

标签: javascript facebook facebook-fql

我有以下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。

3 个答案:

答案 0 :(得分:1)

API是异步的。在结果实际可用之前,您将无法看到结果。

如果您将警报移至内部响应函数,就像在for循环之后,事情应该会更好。

答案 1 :(得分:1)

这是一个JavaScript问题。具体来说,这是您理解异步事件和回调的问题。

如果你看一下你的程序结构,很明显你是:

  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
  4. 然而,并不总是清楚的是API请求是异步的。当您致电FB.api()时,API请求已启动,但不会立即完成。这就是FB.api()的第二个参数;它允许您指定一个函数(即代码块),其执行被延迟,直到API请求完成一段时间后

    您只能在回调函数中使用API​​调用的结果。当然,albums数组已被声明;但是直到它被回调填充,它的长度为0;而你正试图访问第二个元素。

答案 2 :(得分:1)

你不是在考虑异步;在传递给FB.api的回调运行之前,不会填充数组,并且在此之前执行alert

alert置于回调函数内部,您应该得到预期的结果。