Вызовите API последовательно, пока ответ не будет пустым - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь непрерывно вызывать API и считать по страницам, пока ответ не станет пустым. Каждая страница возвращает максимум 1000 «результатов», пока в конечном итоге не вернет только [].

Я пытался выполнить приведенный ниже код, но цикл while продолжается неопределенно долго, и для флага никогда не устанавливается значение false, несмотря на то, что я знаю, что страница 5 возвращает пустое значение.

 var count = 1;
 var flag = true;
 var request = new XMLHttpRequest();

 while (flag == true) {
    request.open('GET', 'https://api.example.net/results/?page=' + count, true);
    count++;
    request.onload = function () {
      var data = JSON.parse(this.response);
      if (data.length == 0) {
        flag = false;
      }
    }
    request.send();
 }

1 Ответ

1 голос
/ 21 марта 2019

Проблема заключается в том, что код асинхронный .В частности, обратный вызов onload срабатывает только при получении ответа, через некоторое время после вызова.Ваш сценарий не останавливается, чтобы «дождаться» ответа, поэтому он продолжает пускать цикл, потому что flag по-прежнему true.К тому времени, когда приходит «пустой» ответ и flag становится ложным, цикл потенциально может выполняться тысячи раз, устанавливая «бесполезные» запросы Ajax.

@ AmitJoki уже предложила, как это исправить.Вот один из способов сделать это (используя рекурсию, предложенную @PranavCBalan - хотя я уже начал писать это, когда увидел его комментарий :-)):

function sendRequest(count) {
    var request = new XMLHttpRequest();
    request.open('GET', 'https://api.example.net/results/?page=' + count, true);
    request.onload = function () {
      var data = JSON.parse(this.response);
      if (data.length > 0) {
        sendRequest(count+1);
      }
    }
    request.send();
}

sendRequest(1);

Ключевое отличие заключается в том, что после отправкиодин запрос, этот код не будет отправлять другой, пока ответ не вернется и не будет подтверждено, что data.length больше 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...