Проблема заключается в том, что код асинхронный .В частности, обратный вызов 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.