Я хочу выполнить Ajax в цикле для получения данных один за другим. Я сделал что-то подобное в моей функции javascript.
var resultType = $("input[name='resultType']:checked").val(); var finalResult = ""; var loadingMessage = "<img src=\"./results/loader.gif\" alt=\"Loading...\"/><br/>This may take several minutes..."; var htmlMessage=loadingMessage; $("#result").html(htmlMessage); for(var i=1;i<5;i++){ $.ajax({ type: "GET", url: "results/result_html.php?usn="+i+"&resultType="+resultType, dataType:"JSON", success:function(result){ finalResult+=result; result=result+htmlMessage; $("#info").hide(); $("#result").html(result); $("#usn").attr("placeholder", "Class USN"); } }); }
Но он не выполняется, как я ожидал. Если я удалю для цикла и дам значение напрямую, тогда все будет правильно. Я не очень хорошо знаком с Ajax. Пожалуйста, кто-нибудь может мне помочь?
вы имеете дело с общей проблемой с закрытием. к моменту выполнения вашего запроса ajax счетчик «i» уже и всегда находится в последнем значении (4).
вам нужно создать новую область для этого счетчика, чтобы этого не произошло; вы можете сделать это двумя способами:
простой способ:
for(var i=1;i<5;i++){ var counter = i; $.ajax({ type: "GET", url: "results/result_html.php?usn="+counter+"&resultType="+resultType, dataType:"JSON", success:function(result){ finalResult+=result; result=result+htmlMessage; $("#info").hide(); $("#result").html(result); $("#usn").attr("placeholder", "Class USN"); } }); }
или правильный путь:
for(var i=1;i<5;i++){ (function(counter){ $.ajax({ type: "GET", url: "results/result_html.php?usn="+"counter"+"&resultType="+resultType, dataType:"JSON", success:function(result){ finalResult+=result; result=result+htmlMessage; $("#info").hide(); $("#result").html(result); $("#usn").attr("placeholder", "Class USN"); } }); })(i);}
Я не вижу проблемы с закрытием в этом коде. Я считаю, что то, что вы пытаетесь достичь, связано с принудительной последовательной нагрузкой. То, как вы сейчас предлагаете, выдает все вызовы ajax «параллельно». Проблема связана с асинхронным характером вызова ajax.
Если вы хотите «упорядочить» запросы, вы можете сделать что-то вроде этого:
var resultType =$("input[name='resultType']:checked").val(); var finalResult=""; var loadingMessage="<img src=\"./results/loader.gif\" alt=\"Loading...\"/><br/>This may take several minutes..."; var htmlMessage=loadingMessage; $("#result").html(htmlMessage); var i = 1; function loadNext(){ if (i < 5){ $.ajax({ type: "GET", url: "results/result_html.php?usn="+i+"&resultType="+resultType, dataType:"JSON", success:function(result){ finalResult+=result; result=result+htmlMessage; $("#info").hide(); $("#result").html(result); $("#usn").attr("placeholder", "Class USN"); loadNext(); } }); i++; } }