2012-03-09 68 views
1

我有以下的JavaScript代码,获取所有谁是当前登录的用户的相册ID用的:Facebook查询循环问题

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。

回答

1

你不是在想异样;数组将不会填充,直到您传递给FB.api的回调运行,并且您的alert在此之前执行。

alert放在你的回调函数中,你应该得到你期望的结果。

1

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

如果你将你的提醒移动到里面的响应函数,就好像在那个for循环之后,事情应该会更好。

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

然而,什么是不总是很清楚的是, API请求是异步的。该API请求是推出时当您拨打FB.api(),但它不是立即完成。这就是FB.api()的第二个参数。它允许你指定一个函数(即一段代码),它的执行被延迟了,直到API请求完成后

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