Javascript - how to work with the iterator in a fo

2019-02-07 01:18发布

I am trying in the for loop to access the value of the i with which the callback function uses.

How can I do this?

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

    });             
}

which calls...

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.")
        }       
    }); 
}

3条回答
对你真心纯属浪费
2楼-- · 2019-02-07 01:25

Probably the most elegant way to do it is just using Array.forEach:

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

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

    });
});

The callback function gets passed:

  1. the current element
  2. the current index
  3. the array it was called upon

Leaving out arguments just means you can’t access them in the callback. (Often you leave out the index and just use the current element).


If a is a NodeList, which doesn’t have forEach, just do:

Array.forEach.call(a, function(someA, i) { ... }
查看更多
欢心
3楼-- · 2019-02-07 01:43
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));
}
查看更多
做自己的国王
4楼-- · 2019-02-07 01:45

It's because the closure captures the variable i itself, not the current value. Try:

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

which will create a new i variable for each loop iteration.

查看更多
登录 后发表回答