Как указано в заголовке, я отправляю несколько вызовов ajax в цикле for. Один для каждой записи в массиве.Несколько запросов ajax для цикла
for (var i = 0; i < myArr.length; i++) {
var request;
if (window.XMLHttpRequest) {
request = new XMLHttpRequest();
} else {
request = new ActiveXObject("Microsoft.XMLHTTP");
}
request.onreadystatechange=function() {
if (request.readyState === 4 && request.status === 200) {
outstandingRequests--;
if (outstandingRequests === 0) {
//some processing would happen in here
} else {
//be patient as more requests need to return
}
}
}
request.open("GET","some_ajax_page.php", true);
outstandingRequests++;
request.send();
}
Когда запрос отправляется выдающиеся нерегулярные значения в приращениях и декрементах при получении ответа. Если выдающиеся Requests равны 0, мы возвращаемся со всех запросов.
Я понимаю, что, поскольку я объявил var request;
внутри тела петли, request
будет локальным только для этой итерации цикла. Аналогично, var i = 0;
в инициализации цикла for
будет означать, что i
является локальным для цикла for
. Поэтому функция, объявленная в onreadystatechange
, должна вызываться, когда каждый запрос возвращается.
Это верно, однако, только последний запрос всегда имеет readystate
из 4 и status
200, так outstandingRequests
никогда не будет уменьшенным до последнего запроса возвращается и, следовательно, никогда не делает его обратно до 0 для дополнительной обработки. Поскольку каждый запрос отдельный запрос, я ожидаю, что все запросы должны получить к readystate
4 и status
200.
я пытался прибегая к помощи и проверки на SO ответов перед публикацией, но большинство из них содержат JQuery или разные проблемы, когда отправляется только один вызов ajax. В моем примере я вижу все ожидаемые вызовы на сервер.
Является ли мое понимание неправильным? или я правильно понимаю, но упустил что-то еще.
Заранее благодарен.
Вы хотите, чтобы вызов ajax был синхронным, так что следующий вызов будет ждать завершения первого вызова. Использовать ajaxq –
не нужно, Quentin имеет правильный ответ - javascript не имеет области действия блока, он имеет функцию scope – Starscream1984
@ KarthickKumar - Нет. Не делай этого. https://xhr.spec.whatwg.org/#sync-warning – Quentin