Правильный подход к получению всех страниц из API, который использует заголовок Link (используя JavaScript/NodeJS)

Я использую модуль NodeJS под названием node-github, который является оберткой вокруг Github API, чтобы получить некоторую статистику об определенных пользователях, таких как их подписчики:

var getFollowers = function(user, callback) {
  github.user.getFollowers(user, function(err, res) {
    console.log("getFollowers", res.length);
    callback(err, res);
  });
};

...

getFollwers({user: mike}, function(err, followers) {
  if(err) {
    console.log(err);
  }
  else {
    console.log(followers);
  }
});

По-видимому, Github ограничивает результаты вызовов до 100 (через per_page параметр) и использует заголовок ссылки, чтобы сообщить, что существует "следующая страница" результатов.

Модуль, который я использую, предоставляет несколько простых методов для обработки заголовка Link, поэтому вам не нужно его анализировать. В принципе, вы можете позвонить github.hasNextPage(res) или же github.getNextPage(res) (где res ответ вы получили от оригинала github.user.getFollowers() вызов)

То, что я ищу, - это правильный подход / парадигма, чтобы моя функция возвращала все результаты, состоящие из всех страниц. Я немного побаловался с рекурсивной функцией, и хотя она работает, я не могу не чувствовать, что может быть лучший подход.

Этот ответ может послужить хорошим подходом к обработке всех будущих вызовов заголовков Link - не только Github - если стандарт зацепится.

Спасибо!

1 ответ

Наконец, прибегаем к рекурсии (вспомним 2 сильных слабости рекурсии: поддержание и объяснение:)). Вот мой текущий код, если кому-то интересно:

var getFollowers = function(callback) {
  var followers = []
  ,  getFollowers = function(error, result) {
      followers = followers.concat(result);
      if(github.hasNextPage(result)) {
        github.getNextPage(result, getFollowers);
      }
      else {
        callback(error, followers);
      }
    };              

  github.user.getFollowers(options, getFollowers);
};

Но я обнаружил, что если вам просто нужно общее количество подписчиков, вы можете использовать функцию getLastPage, чтобы получить число подписчиков на последней странице, а затем

total_num_of_followers = num_of_followers_on_last_page + (total_num_of_pages * results_per_page)

Другие вопросы по тегам