У меня есть проблема при использовании jQuery .each () и .ajax () функции вместе. Я использую .each () для цикличного выполнения через 5 элементов и выполняю .ajax () призыв к каждому. Моя проблема состоит в том, что я только хочу, чтобы цикл продолжился, когда ответ был получен от каждого запроса ajax. В настоящее время все 5 элементов циклично выполняются, 5 ajax запрашивает быть сделанным, затем 5 возвращаемых ответов.
Hers простой пример:
$(".element").each(function() {
var id= $(this).find(('txtId').val();
$.ajax({
type: "POST",
url: "/Handlers/Handler.ashx",
data: "ID=" + id,
success: function(xml){
// I would like the each() loop to pause until this is hit,
// and some additional logic can be performed.
}
});
});
Удачи.
Вы можете использовать параметр async
, чтобы сделать каждый запрос синхронным (= останавливать выполнение скрипта до тех пор, пока каждый запрос завершен):
async По умолчанию все запросы отправляются асинхронно (т.е. по умолчанию установлено значение true). Если вам нужны синхронные запросы, установите для этого параметра значение false. Междоменные запросы и запросы dataType: jsonp не поддерживают синхронную работу. Обратите внимание, что синхронные запросы могут временно заблокировать браузер, отключив любые действия, пока запрос активен.
но, как уже сказано в документации, это крайне не рекомендуется, так как это может привести к зависанию браузера, если запрос зависнет или истечет время ожидания.
Было бы лучше изменить архитектуру вашего кода таким образом, чтобы он мог работать с классическими функциями обратного вызова, если это вообще возможно.
Пекка знает правильный ответ. Вам просто нужно отредактировать свой сценарий, как показано ниже.
$(".element").each(function() {
var id= $(this).find(('txtId').val();
$.ajax({
type: "POST",
async: false,
url: "/Handlers/Handler.ashx",
data: "ID=" + id,
success: function(xml){
}
});
});