2011-08-08 8 views
9

jQuery를 사용하여 루프에서 "GET"을 사용하여 서버에서 여러 결과를 얻습니다. 콜백에 고정 된 매개 변수로 루프 인덱스를 포함하고 싶지만 작동하지 않습니다. for 루프 내에서 클로저 - 루프 변수를 매개 변수로 사용하는 콜백

(나는 그것을 수행하는 방법에 대한 this article의 조언을 따랐다.)

그러나, 나는 다시 호출에 들어갈 값은 내가 기대 완전하지 않다 - 오히려 각 루프 인덱스 값보다 항상 동일 인덱스의 종료 값으로.

즉. 여기서 코드 조각은 콜백의 각 실행마다 '16'을 출력합니다. 1, 2, 3을 인쇄하려면 어떻게해야합니까? (순서가 다를 수 있음을 알았습니다.)

다음 코드 외에도 콜백 함수를 지정하는 몇 가지 방법을 시도했습니다 예 : function(data, textStatus) { return test(data, textStatus, idx); }, 'text');

어떻게 작동하나요?

function test(data, textStatus, siteNo) 
{ 
    console.log("siteNo=" + siteNo); 
} 

function loadConfigLists() 
{ 
    var siteReport; 
    // retrieve site configuration 
    jQuery.get("svGetSiteConfig.php", function(data, textStatus)  
    { 
     // retrieve port configuration for all sites 
     for (var idx=1; idx<=15; idx++) 
     { 
      var probeIP = siteConfigArray[idx].siteIP; 
      if (probeIP != "" && probeIP != null) 
      jQuery.get("svGetPortInfo.php?svSiteIpAddr=" + probeIP+"&s="+idx,  
        function(data, textStatus) { test(data, textStatus, idx); }, 'text');  
      else // IP value is blank 
       siteConfigArray[idx].portManifest = null; 
     } 
     } 
    }, 'text');  
} 

답변

29

이것은 클로저에서 매우 표준적인 문제입니다. 이 작업을 수행 할 때 : 당신은 idx에 대한 참조를 바인딩하고

function(data, textStatus) { test(data, textStatus, idx); } 

하지만 idx의 값. 따라서 콜백이 호출 될 때까지 루프가 완료되고 idx은 바인딩 한 모든 콜백에서 16이됩니다. 당신이 모두 함께 유지하려면

function build_callback(idx) { 
    return function(data, textStatus) { 
     test(data, textStatus, idx); 
    }; 
} 

// And then... 

jQuery.get("svGetPortInfo.php?svSiteIpAddr=" + probeIP+"&s="+idx, build_callback(idx), 'text'); 

당신은 또한 자동 실행 기능을 함수를 인라인 할 수 있습니다 :

일반적인 솔루션은 함수 호출을 통해 idx의 평가를 강제하는 것입니다

for (var idx=1; idx<=15; idx++) 
    (function(idx) { 
     var probeIP = siteConfigArray[idx].siteIP; 
     if (probeIP != "" && probeIP != null) 
      jQuery.get("svGetPortInfo.php?svSiteIpAddr=" + probeIP+"&s="+idx, 
       function(data, textStatus) { test(data, textStatus, idx); }, 'text'); 
     else // IP value is blank 
      siteConfigArray[idx].portManifest = null; 
    })(idx); 

함수 호출은 함수가 호출 될 때 idx 값을 제공하며 값은 idx입니다.

+0

감사합니다. 그랬어. – Danny

+0

영리한! ........... :-) – TMS

+0

고마워, 나는 더 편리한 방법은 모든 함수 (var {}를 사용하는 blahblah)를 (function (ii) {return function ({ 오래된 코드이지만 i를 "ii"로 변경)}}) (i); –