小编典典

jQuery:合并多个JSON结果

ajax

情况: 用户想使用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 + '"');
                }
            }
        }
    });
}

题:

  1. 在接收所有条目之前重复JSON调用的最有效方法是什么?

  2. 如何将不同的响应组合成一个对象?

我尝试过的

由于复杂/嵌套的情况,使用http://api.jquery.com/jQuery.extend/合并时陷入困境


阅读 480

收藏
2020-07-26

共1个答案

小编典典

因为只需要数组项,所以可以$.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()

2020-07-26