2011-08-08 98 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

這是一個非常標準的閉包問題。當你這樣做:

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

你參考結合idx但還沒有達到idx值。所以,當你的回調被調用的時候,循環將完成,並且idx將在你綁定的所有回調中爲16。

通常的解決辦法是通過函數調用來強制idx評價:

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

您還可以自動執行內聯函數的功能,如果你想保持它一起:

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 i}的blahblah變成(function(ii){return function(){舊代碼,但將我更改爲「ii」}})(i); –