2013-08-17 107 views
0

我正在嘗試在javascript中創建一個對象數組,但是當我嘗試將數組打印到控制檯(使用chrome)時,我得到的所有內容都是undefine,除非我在推後纔打印數組。對象的Javascript數組undefined

var subitems = []; 
for (var i = 1; i < 1000; i = i + 50) { 
     $.getJSON('http://gdata.youtube.com/feeds/api/users/' + username + '/subscriptions?max-results=50&start-index=' + i + '&alt=json', function (data) { 
      var output = ""; 
      for (var x in data.feed.entry) { 
       var subtitle = data.feed.entry[x].yt$username.$t; 
       var subchannel = data.feed.entry[x].yt$channelId.$t; 
       var subphoto = data.feed.entry[x].media$thumbnail.url; 
       subitems.push({ 
        subtitle: subtitle, 
        subchannel: subchannel, 
        subphoto: subphoto 
       }); 
       console.log(subitems[0]); //Prints Fine 
       output += '<div class="subtitle"><img src="' + subphoto + '"> <a href="http://www.youtube.com/channel/' + subchannel + '">' + propercase(subtitle) + '</a></div>'; 
      } 
      maincontent.innerHTML = maincontent.innerHTML + output; 
     }); 
} 
console.log(subitems[0]); //This is undefined 
+0

將console.log放入getJSON函數回調中。所調用的Ajax通常是異步運行的,因此可以在準備就緒時調用該函數,但在運行內部代碼之前立即在getJSON調用之後運行該代碼。否則,它可以鎖定頁面/界面。 –

+0

是否有可能是因爲xhr是異步的,子項目在你登錄時沒有被設置(當它是未定義的)? – HMR

+1

另外,我會避免一次性創建多個Ajax調用。 –

回答

1

這裏是這樣做的「更簡單」的方式:數XHR請求和火的時候,所有的請求都返回的完成功能:

var xhrCount = 0; 
for (var i = 1; i < 1000; i = i + 50) { 
    xhrCount++; // increment before request 
    $.getJSON('http://gdata.youtube.com/feeds/api/users/' + username + '/subscriptions?max-results=50&start-index=' + i + '&alt=json', function (data) { 
      // process response  
      // decrement after request is processed 
      xhrCount--; 
      if (xhrCount === 0) { 
       // at this point all requests have returned 
       console.log(subitems); 
      } 
     } 
    } 
} 

更新:更好的方法是利用jQuery.Deferred()對象。 A quick demo is setup here需要一些修復。總體思路是跟蹤您製作的所有AJAX請求,並將它們傳遞給deferred.when(),並使用deferred.done()分配完成的功能。代碼(下調爲便於閱讀):

var subitems = []; 
var deferreds = []; 
for (var i = 1; i < 1000; i = i + 50) { 
    var deferred = $.getJSON('https://gdata.youtube.com/feeds/api/users/warnerbrospictures/uploads?max-results=50&start-index=' + i + '&alt=json', function (data) { 
     for (var j = 0; j < data.feed.entry.length; j++) { 
      subitems.push({ 
       title: data.feed.entry[j].title.$t 
      }); 
     } 
    }); 
    deferreds.push(deferred); 
} 
$.when.apply($, deferreds).done(function() { 
    console.clear(); 
    console.log(subitems); 
    for (var i = 0; i < subitems.length; i++) { 
     console.log(subitems[i].title); 
    } 
}); 

注:谷歌數據饋送包含結果的總數,因此可以消除硬編碼「1000」。

+0

爲什麼不只是投票關閉,因爲它是重複? –

+1

@JanDvorak:重複是一個很好的閱讀。在這個問題中推薦的解決方案來重組代碼;我已經解釋過在這個特殊情況下如何做到這一點。 –

+0

我確信這個答案可以合併到重複中。這個騙局肯定會受益。 –

-2

嘗試聲明您的數組爲:

var subitems = [{}]; 
+2

這不會幫助。數組的聲明不是問題。 –

+0

有沒有理由開始數組與一個額外的空對象insid –