情况:用户希望使用Youtube的JSON API在JQuery网站中导入Youtube播放列表。
问题: Youtube只返回前50个条目,但播放列表的长度可以超过100个(长度由JSON响应中的'totalItems'给出)。所有条目都需要合并为1个对象,最后需要将其推送到输出函数中。
当前代码:
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/合并,由于复杂/嵌套情况而卡住了
答案 0 :(得分: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()
。
答案 1 :(得分:1)
您应该可以使用start-index参数从google调用下一组结果。您可以递归调用fetchPlaylist()方法,同时更改每个调用的start-index,直到获得所有调用。
使用.extend()合并结果
答案 2 :(得分:0)
由于我的声誉,我无法发表任何评论。但是,您是否应该使用count(responseData.data.items)
来增加+ 50变量来覆盖YouTube API中的更改?
我知道使用max-results=50
调用JSON请求,但他们可以开始将此限制为较少的项目。