情况: 用户想使用Youtube的JSON API在JQuery网站中导入Youtube播放列表。
问题: 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 + '"'); } } } }); }
题:
在接收所有条目之前重复JSON调用的最有效方法是什么?
如何将不同的响应组合成一个对象?
我尝试过的
由于复杂/嵌套的情况,使用http://api.jquery.com/jQuery.extend/合并时陷入困境
因为只需要数组项,所以可以$.merge()在重复函数中使用:
$.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 + '"'); } } } }); }
您可以在这里尝试一下,只需使用播放列表ID进行调用即可,如下所示:
fetchPlaylist("84780DAC99E1A285");
每次请求完成时,我们都会查看totalItemsyoutube返回的值是否高于请求的值加50,如果是这种情况,请再次获取并添加这些结果…如果没有,那么我们将合并的数组传递给outputFunction()。
totalItems
outputFunction()