2011-08-08 14 views
9

Tôi đang sử dụng jQuery "GET" trong vòng lặp để nhận được một số kết quả từ máy chủ. Tôi muốn bao gồm các chỉ số vòng lặp như là một tham số cố định để gọi lại nhưng nó không hoạt động.đóng trong vòng lặp for - gọi lại với biến vòng lặp làm tham số

(Tôi làm theo các lời khuyên của this article về cách để làm điều đó.)

Tuy nhiên, giá trị tôi nhận được trong các cuộc gọi trở lại là hoàn toàn không phải là điều tôi mong đợi - chứ không phải mỗi giá trị chỉ số vòng lặp, nó luôn luôn là bình đẳng với giá trị thoát của chỉ mục.

tức là. đoạn mã ở đây in ra '16' cho mỗi lần thực hiện cuộc gọi lại. Làm thế nào để tôi in nó 1, 2, 3 ... (Tôi nhận ra thứ tự có thể khác, đó là tiền phạt)

Ngoài mã bên dưới, tôi đã thử một số cách để xác định chức năng gọi lại , ví dụ. function(data, textStatus) { return test(data, textStatus, idx); }, 'text'); v.v.

Làm cách nào để hoạt động?

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

Trả lời

29

Đây là vấn đề khá chuẩn với đóng cửa. Khi bạn làm điều này:

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

Bạn đang ràng buộc một tham chiếu đến idx nhưng chưa đến giá trị của idx. Vì vậy, vào thời điểm gọi lại của bạn được gọi, vòng lặp sẽ kết thúc và idx sẽ là 16 trong tất cả các cuộc gọi lại mà bạn bị ràng buộc.

Giải pháp thông thường là để buộc đánh giá idx thông qua một cuộc gọi chức năng:

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

Bạn cũng có thể nội tuyến chức năng với một chức năng tự thực hiện nếu bạn muốn giữ nó tất cả cùng nhau:

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

Lệnh gọi hàm cung cấp cho bạn giá trị idx khi hàm được gọi và đó là giá trị của idx mà bạn muốn.

+0

Cảm ơn! Điều đó đã làm điều đó. – Danny

+0

Thông minh! ........... :-) – TMS

+0

Cảm ơn, tôi đã tìm thấy một cách tiện dụng hơn nữa là biến mọi hàm() {blahblah sử dụng var i} thành (hàm (ii) {return function() { mã cũ nhưng thay đổi i thành "ii"}}) (i); –