Правильный подход к получению всех страниц из 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)