2010-10-04 92 views
4

情況:用戶希望使用Youtube的JSON API在JQuery網站中導入Youtube播放列表。JQuery:合併多個JSON結果

問題: Youtube僅返回前50條目,但播放列表可能有100條以上的條目(長度由JSON響應中的'totalItems'給出)。所有條目都需要合併爲1個對象,並且最後需要將其輸入到輸出函數中。

入門1-50:http://gdata.youtube.com/feeds/api/playlists/84780DAC99E1A285?v=2&alt=jsonc&max-results=50&start-index=1

進入50-100:http://gdata.youtube.com/feeds/api/playlists/84780DAC99E1A285?v=2&alt=jsonc&max-results=50&start-index=50

當前代碼:

function fetchPlaylist(pid) { 
    var the_url = 'http://gdata.youtube.com/feeds/api/playlists/' + encodeURIComponent(pid) + '?v=2&alt=jsonc&max-results=50'; 
    $.ajax({ 
     type: "GET", 
     url: the_url, 
     dataType: "jsonp", 
     success: function (responseData, textStatus, XMLHttpRequest) { 
      if (responseData.data != null) { 
       if (responseData.data.items) { 
        outputFunction(responseData.data.items); 
       } else { 
        console.log('No results for playlist: "' + pid + '"'); 
       } 
      } 
     } 
    }); 
} 

問:

  1. 在收到所有條目之前,重複JSON調用的最有效方式是什麼?

  2. 如何將不同的響應組合成一個對象?

我已經試過什麼:

與使用http://api.jquery.com/jQuery.extend/合併,卡住了,因爲複雜/嵌套情況

+1

對於合併,'$。extend()'有一個深層複製選項,例如:'$ .extend(true,results,newResultsToAdd);' – 2010-10-04 16:42:09

回答

4

既然你只是想這是一個數組中的項目,你可以在重複功能使用$.merge()

function fetchPlaylist(pid, start, items) { 
    items = items || []; 
    start = start || 0; 
    var the_url = 'http://gdata.youtube.com/feeds/api/playlists/' + encodeURIComponent(pid) + '?v=2&alt=jsonc&max-results=50'; 
    $.ajax({ 
     type: "GET", 
     url: the_url, 
     data: { start: start }, 
     dataType: "jsonp", 
     success: function(responseData, textStatus, XMLHttpRequest) { 
     if (responseData.data != null) { 
      if (responseData.data.items) { 
      $.merge(items, responseData.data.items); //add to items 
      if (responseData.data.totalItems > start + 50) { 
       fetchPlaylist(pid, start + 50, items); 
      } else { 
       outputFunction(items); 
      } 
      } else { 
      console.log('No results for playlist: "' + pid + '"'); 
      } 
     } 
     } 
    }); 
} 

You can give it a try here,你只需要調用它帶有播放列表ID,如下所示:

fetchPlaylist("84780DAC99E1A285");​ 

每次請求完成時,我們看看youtube返回的totalItems是否高於我們要求的加上50,如果是這樣的話,再次獲取,添加結果...如果不是,那麼我們完成並將組合數組傳遞給outputFunction()

+0

不錯的工作。 start參數是否應附加到the_url? – fehays 2010-10-04 17:05:22

+0

@fehays - oh,right,woops,one moment – 2010-10-04 17:06:19

+0

Nick!非常感謝您的解釋,我從您的方法中學到了很多東西! – MeProtozoan 2010-10-04 17:06:53

1
  1. 您應該能夠使用開始-index參數來調用google的下一組結果。您可以遞歸地調用您的fetchPlaylist()方法,同時更改每個調用的開始索引,直到獲得所有這些調用的開始索引。

  2. 使用.extend()合併的結果

+0

謝謝Fehays!這正是尼克所做的:D – MeProtozoan 2010-10-04 17:12:26

0

由於我的聲望,我無法發表任何評論。但是,您是否應該使用count(responseData.data.items)來增加+50變量以涵蓋YouTube API中的更改?

我知道JSON請求是用max-results=50調用的,但他們可能會開始將此限制爲較少數量的項目。