JQuery: объединить несколько результатов JSON

Ситуация: Пользователь хочет импортировать плейлист Youtube на сайт JQuery, используя JSON API YouTube.

Проблема: Youtube возвращает только первые 50 записей, но плейлисты могут иметь длину более 100 записей (длина указана в TotalItems в ответе JSON). Все записи должны быть объединены как 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/ застрял из-за сложной / вложенной ситуации

 Nick Craver04 окт. 2010 г., 18:42
Для слияния,$.extend() имеет параметр глубокого копирования, например:$.extend(true, results, newResultsToAdd);

Ответы на вопрос(3)

Я не могу оставлять комментарии еще из-за моей репутации. Но вы не должны делать приращение переменной +50, используяcount(responseData.data.items), чтобы покрыть изменения в API YouTube?

Я знаю, что запрос JSON вызывается сmax-results=50, но они могли бы начать ограничивать это меньшим количеством пунктов.

Вы должны быть в состоянии использовать параметр start-index для вызова следующего набора результатов из Google. Возможно, вы могли бы рекурсивно вызывать ваш метод fetchPlaylist (), изменяя стартовый индекс для каждого вызова, пока не получите все из них.

использование.extend () объединить результаты

 MeProtozoan04 окт. 2010 г., 19:12
Спасибо Fehays! Это именно то, что сделал Ник: D
Решение Вопроса

Поскольку вы просто хотите элементы, которые являются массивом, вы можете использовать$.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 + '"');
          }
        }
      }
  });
}

Вы можете попробовать это здесьВы просто вызываете его с идентификатором плейлиста, например так:

fetchPlaylist("84780DAC99E1A285");​

Каждый раз, когда запрос завершается, мы видим,totalItems что YouTube возвращает больше, чем мы запросили плюс 50, если это так, извлеките снова, добавьте эти результаты ... если нет, то мы закончили и передали объединенный массив вoutputFunction().

 Nick Craver04 окт. 2010 г., 19:06
@fehays - о, верно, вупс, один момент
 Nick Craver04 окт. 2010 г., 19:09
@MeProtozoan - добро пожаловать :) @fehays - исправлено! демо-версия также обновлена. Вы можете переместить другие параметры вdata часть, все, что работает на самом деле
 fehays04 окт. 2010 г., 19:05
хорошо сделано. должен ли параметр start добавляться к the_url?
 MeProtozoan04 окт. 2010 г., 19:06
Ник! Большое спасибо за ваше объяснение, я многому научился от вашего подхода!

Ваш ответ на вопрос