2012-03-09 63 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;而你正試圖訪問第二個元素。