2012-02-21 10 views
7

Próbuję w pętli for, aby uzyskać dostęp do wartości i, z którą funkcja wywołania zwrotnego używa.Javascript - jak pracować z iteratorem w pętli for z oddzwanianiem

Jak mogę to zrobić?

for (var i = 0; i < a.length; i++) 
{ 
    calcRoute(fixedLocation, my_cities[i].address, function(response) { 

     // i want here to have the current "i" here 

    });    
} 

który wywołuje ...

function calcRoute(x, y, callback) { 

    var start = x; 
    var end = y; 

    var request = { 
     origin:start, 
     destination:end, 
     travelMode: google.maps.TravelMode.DRIVING, 
     unitSystem: google.maps.UnitSystem.METRIC, 
     optimizeWaypoints: true 
    }; 

    directionsService.route(request, function(response, status) { 
     if (status == google.maps.DirectionsStatus.OK) { 
      callback(response);                 
     } else { 
      alert("City unknown.") 
     }  
    }); 
} 

Odpowiedz

12

To dlatego zamknięcie oddaje zmiennej sam i, a nie bieżącą wartość. Wypróbuj:

for (var i = 0; i < a.length; i++) (function(i) 
{ 
    calcRoute(fixedLocation, my_cities[i].address, function(response) { 

     // i want here to have the current "i" here 

    });    

}) (i); 

, która utworzy nową zmienną i dla każdej iteracji pętli.

1
for (var i = 0; i < a.length; i++) { 

    function createCallback(i) { 
    return function(response) { 
     // i want here to have the current "i" here 
    } 
    } 

    calcRoute(fixedLocation, my_cities[i].address, createCallback(i)); 
} 
2

Prawdopodobnie najbardziej elegancki sposób to zrobić jest tylko przy użyciu Array.forEach:

a.forEach(function(someA, i) { 
    calcRoute(fixedLocation, my_cities[i].address, function(response) { 

     // i want here to have the current "i" here 

    }); 
}); 

Funkcja zwrotna zostanie przeniesiony:

  1. bieżący element
  2. obecny wskaźnik
  3. tablica, do której został wywołany

Opuszczanie argumentów oznacza po prostu, że nie można uzyskać do nich dostępu w wywołaniu zwrotnym. (Często pomijasz indeks i używasz tylko bieżącego elementu).


Jeśli a jest NodeList, który nie posiada forEach, po prostu zrobić:

Array.forEach.call(a, function(someA, i) { ... }