chiusura all’interno di un ciclo for – callback con variabile loop come parametro

Sto usando jQuery “GET” in un ciclo per ottenere diversi risultati dal server. Voglio includere l’indice del ciclo come parametro fisso per la richiamata, ma non funziona.

(Ho seguito il consiglio di questo articolo su come farlo).

Tuttavia, il valore che ottengo nella richiamata non è completamente quello che mi aspetto, piuttosto che ogni valore dell’indice del ciclo, è sempre uguale al valore di uscita dell’indice.

vale a dire. il frammento di codice qui stampa ’16’ per ogni esecuzione del callback. Come faccio a stampare 1, 2, 3 … (mi rendo conto che l’ordine potrebbe essere diverso, va bene)

Oltre al codice qui sotto, ho provato diversi modi per specificare la funzione di richiamata, ad es. function(data, textStatus) { return test(data, textStatus, idx); }, 'text'); eccetera.

    Come dovrebbe funzionare?

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

    Questo è un problema abbastanza comune con chiusure. Quando lo fai:

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

    Stai vincolando un riferimento a idx ma non al valore di idx . Quindi, quando viene richiamato il callback, il ciclo avrà finito e idx sarà 16 in tutte le callback che hai associato.

    La solita soluzione è forzare la valutazione di idx attraverso una chiamata di funzione:

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

    Puoi anche allineare la funzione con una funzione autoesecutiva se vuoi mantenere tutto insieme:

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

    La chiamata alla funzione ti dà il valore di idx quando viene chiamata la funzione e questo è il valore di idx che desideri.