2013-02-26 6 views
3

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); 

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"); 
     } 
    }); 
} 

그러나 예상대로 실행되지 않습니다. for 루프를 제거하고 직접 값을 제공하면 모든 것이 적절합니다. 나는 Ajax에 익숙하지 않다. 누구든지 나를 도울 수 있습니까?

+1

우선; 너는 무엇을 기대 하느냐? 결과는 이제 모든 요청에서 무시 될 것 같습니다. –

+0

결과를 하나씩 얻고 싶습니다. 각 루프에서'usn'이 바뀌는 것을보십시오. 나는 그것이 틀렸다는 것을 알고 그것을 올바르게 만드는 법을 모른다. 각 결과를 finalResult와 연결하려고합니다. –

+0

서버에서 JSON 데이터를 가져올 것으로 지정했지만 반환 된 데이터를 JOSON 맵으로 사용하지 마십시오. 맞습니까? – sdespont

답변

2

당신은 클로저에 공통적 인 문제를 다루고 있습니다. 귀하의 아약스 요청이 실행될 때까지 카운터 "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);} 
+1

클로저의 문제점은 어디에 있습니까? – DanC

+0

당신이 옳다고 생각 DanC, 질문이 올바르게 지정하지 않았기 때문에 그 문제를 가정했습니다. 내 나쁜 –

+0

두 번째는 나를 위해 완벽합니다. 고마워요. –

2

이 코드의 폐쇄에 문제가 표시되지 않습니다를. 나는 당신이 달성하고자하는 것이 순차적 인로드를 강요하는 것과 관련이 있다고 믿습니다. 현재 제안하고있는 방식은 모든 ajax 호출을 '병렬로'발행합니다. 문제는 ajax 호출의 비동기 특성에 의존합니다.

당신이 'sequentialize'요청이, 당신은 같은 것을 할 수있는하려면 : 모든

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++; 
    } 
} 
관련 문제