2015-07-24 3 views
0

Как указано в заголовке, я отправляю несколько вызовов 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. В моем примере я вижу все ожидаемые вызовы на сервер.

Является ли мое понимание неправильным? или я правильно понимаю, но упустил что-то еще.

Заранее благодарен.

+0

Вы хотите, чтобы вызов ajax был синхронным, так что следующий вызов будет ждать завершения первого вызова. Использовать ajaxq –

+0

не нужно, Quentin имеет правильный ответ - javascript не имеет области действия блока, он имеет функцию scope – Starscream1984

+0

@ KarthickKumar - Нет. Не делай этого. https://xhr.spec.whatwg.org/#sync-warning – Quentin

ответ

2

Я понимаю, что, поскольку я объявил запрос var; внутри тела цикла запрос будет локальным только для этой итерации цикла.

No. var объявляет переменную с функцией рамки уровня.

Необходимо let (limited support) для блок уровень объема.

Переместите тело вашего цикла в функцию, а затем вызовите эту функцию изнутри цикла.

+0

Спасибо, но похоже, что поддержка уровня блока упала. – Chris

+0

@ Крис. Вы должны явно заявить, что используете JS 1.7. Вместо этого переместите тело цикла в функцию. – Quentin

+0

Перемещение тела в функцию теперь заставляет мой код реагировать так, как ожидалось. Спасибо, также за разъяснение моего недоразумения. Я выполнил свой ответ, но у меня нет репутации, поэтому он не показывает. – Chris

Смежные вопросы