Facebook查询循环问题

Facebook query looping issue

本文关键字:问题 循环 查询 Facebook      更新时间:2023-09-26

我有以下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问题。具体来说,这是一个理解异步事件和回调的问题。

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

  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

然而,并不总是清楚的是API请求是异步的。当您调用FB.api()时,API请求被启动,但不会立即完成。这就是FB.api()的第二个参数的作用;它允许您指定一个函数(即代码块),该函数的执行将延迟到稍后API请求完成为止

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