JQuery: объединить несколько результатов JSON - PullRequest
4 голосов
/ 04 октября 2010

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

Проблема: Youtube возвращает только первые 50 записей, но плейлисты могут иметь длину более 100 записей (длина указана в TotalItems в ответе JSON) Все записи должны быть объединены как один объект и должны быть помещены в выходную функцию в конце.

Запись 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/, застряло из-за сложной / вложенной ситуации

Ответы [ 3 ]

4 голосов
/ 04 октября 2010

Поскольку вы просто хотите, чтобы элементы представляли собой массив, вы можете использовать $.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().

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

  2. use .extend () для объединения результатов

0 голосов
/ 05 октября 2010

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

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

...