2010-10-20 18 views
5

Desidero aggiungere alcuni parametri aggiuntivi alla chiamata dell'API geocoder di Google poiché sto eseguendolo in un ciclo, ma non sono sicuro di come aggiungere i parametri di chiusura alla loro funzione anonima che ha già parametri predefiniti che vengono passati dalla chiamata all'API.Collegamento di parametri con chiusure javascript ai parametri predefiniti nelle funzioni anonime

Ad esempio:

for(var i = 0; i < 5; i++) { 
    geocoder.geocode({'address': address}, function(results, status) { 
     // Geocoder stuff here 
    }); 
} 

voglio essere in grado di utilizzare il valore dei nel geocoder.geocode passato() funzione anonima, ma se avessi una chiusura utilizzando }(i)); sulla linea 4 per esempio, che sostituirebbe il primo parametro che interromperà il geocoder.

C'è un modo per utilizzare le chiusure o passare il valore di i alla funzione anonima?

Effettivamente quello che voglio fare è:

geocoder.geocode({'address': address}, function(results, status, i) { 
    alert(i); // 0, 1, 2, 3, 4 
}(i)); 

ma lavorando :-)

risposta

11

È possibile accedere direttamente da voi i funzione anonima (tramite chiusura), ma è necessario catturarlo in modo che ogni chiamata a geocode ottenga la propria copia. Come al solito in javascript, l'aggiunta di un'altra funzione farà il trucco. Ho rinominato la variabile i esterna per renderla più chiara:

for(var iter = 0; iter < 5; iter++) { 
    (function(i) { 
     geocoder.geocode({'address': address}, function(results, status) { 
      // Geocoder stuff here 
      // you can freely access i here 
     }); 
    })(iter); 
} 
+0

Una soluzione ancora più semplice! Avrei dovuto postare più presto – WheresWardy

+1

Stavo per dire che era confusionario avere 'i' nello scope esterno e nell'ambito interno, ma vedo che l'hai risolto ora così ti lascerò sfuggire :) – Skilldrick

+0

Suggerisco che questo esempio è il migliore perché gli altri (sono più semplici) non funzionano nel mio caso: l'i all'interno della funzione di callback geocoder è sempre l'ultimo del ciclo. Immagino, dipende dalla natura asincrona del browser. Ma questa risposta ha funzionato perfettamente! +1! – Igor

3
function geoOuter(i) { 
    geocoder.geocode({'address': address}, function(results, status) { 
     // Geocoder stuff here 
     // This has access to i in the outer function, which will be bound to 
     // a different value of i for each iteration of the loop 
    }); 
} 

for(var i = 0; i < 5; i++) { 
    geoOuter(i); 
} 

oughta farlo ...

+0

Una risposta così semplice. Grazie mille :-) – WheresWardy

Problemi correlati