Я пытаюсь получить список всех фрагментов кода проекта GitLab (не GitHub!). GitLab API позволяет мне собирать не более 100 фрагментов за вызов, но предоставляет заголовки ссылок для других (next
, prev
, first
и last
) страниц (см. эту часть API GitLab ).
Каков наилучший способ выполнить асинхронные вызовы jQuery.get для всех страниц и затем передать все результаты в одной функции обратного вызова?
Ни одна из двух предложенных мною идей не кажется очень привлекательной:
Сделайте фиктивный вызов для первой страницы, чтобы получить общее количество страниц (X-Total-Pages
в getResponseHeader), затемсгенерируйте все jQuery.get
с и передайте их jQuery.when
.Не так уж плохо, но вызов первой страницы потрачен впустую.
Запустите jQuery.get
s в цикле while, и каждый из них сохранит свои данные в некоторой глобальной переменной перед запускомобратный вызов этой глобальной переменной.Недостатком является то, что вызовы не выполняются параллельно, и глобальная переменная не выглядит чистым решением.
Поскольку я думаю, что это должно быть несколько распространенной проблемой, я надеялся, чтогде-нибудь чистое решение?
РЕДАКТИРОВАТЬ
Вот реализация первой идеи, чтобы проиллюстрировать то, что я прошу, а именно, как избежать первого вызова $.getJSON
, чьи результатыне используется?
function getAllSnippets(callback){
//Make a dummy call to get number of pages
data = {"private_token": "my_private_token", "per_page": 100, "page":1}
$.when(
$.getJSON("https://myserver/api/snippets",data)
).then(function( data, textStatus, jqXHR ) {
//Get the number of pages
numPages = jqXHR.getResponseHeader('X-Total-Pages')
console.log(numPages+' pages in total')
//Generate queries for each new page
var promises = [];
for (var iPage = 1; iPage < numPages+1; iPage++) {
data = {"private_token": "my_private_token", "per_page": 100, "page":iPage}
promises.push($.getJSON("https://myserver/api/snippets",data));
}
//Collect and merge results from all calls
Promise.all(promises).then(function(results) {
answers = []
for (var iPage = 0; iPage < numPages; iPage++){
answers = $.merge( answers, results[iPage] );
}
callback(answers);
}, function(err) {
alert("Failed to collect code snippets"+err);
});
});
}