jQuery получает результаты со * всех * страниц заголовка ссылки в один обратный вызов - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь получить список всех фрагментов кода проекта 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);
        });
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...