2010-10-04 62 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调用的,但他们可能会开始将此限制为较少数量的项目。