2011-08-08 20 views
9

Używam jQuery "GET" w pętli, aby uzyskać kilka wyników z serwera. Chcę włączyć indeks pętli jako stały parametr do oddzwonienia, ale nie działa.zamknięcie wewnątrz pętli for - wywołanie zwrotne z zmienną pętli jako parametr

(I pójść za radą this article o tym, jak to zrobić.)

Jednakże wartość dostaję w oddzwaniania nie jest całkowicie czego oczekuję - zamiast każdej wartości indeksu pętli, to jest zawsze równa do wartości wyjściowej indeksu.

tj. fragment kodu tutaj wypisuje "16" dla każdego wykonania wywołania zwrotnego. Jak mogę go wydrukować 1, 2, 3 ... (Rozumiem, że kolejność może być inna, to w porządku)

Oprócz kodu poniżej, wypróbowałem kilka sposobów, aby określić funkcję oddzwonienia np. function(data, textStatus) { return test(data, textStatus, idx); }, 'text'); itp.

Jak to ma działać?

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

Odpowiedz

29

Jest to dość standardowy problem z zamknięciami. Po wykonaniu tej czynności:

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

Ty wiążące odniesienie do idx ale nie do wartości idx. Tak więc, do czasu wywołania wywołania zwrotnego, pętla zostanie zakończona, a idx będzie 16 we wszystkich wywołanych połączeniach zwrotnych.

Typowym rozwiązaniem jest zmuszenie ocenę idx poprzez wywołanie funkcji:

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

Można również inline funkcję z samodzielnego wykonywania funkcji, jeśli chcesz, aby utrzymać to wszystko razem:

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

Wywołanie funkcji daje wartość idx, gdy funkcja jest wywoływana i jest to wartość idx, którą chcesz.

+0

Dzięki! Tak było. – Danny

+0

Sprytny! ........... :-) – TMS

+0

Dzięki, znalazłem jeszcze bardziej przydatny sposób, aby włączyć każdą funkcję() {blahblah, który używa var i} do (function (ii) {return function() { stary kod, ale zmienia się na "ii"}}) (i); –

Powiązane problemy