загадка: значение в clousure изменено - PullRequest
0 голосов
/ 14 сентября 2010

Я использую http://tile.cloudmade.com/wml/latest/web-maps-lite.js для геокодирования.

Существует массив адресов, содержащий около 20 адресов

addresses[n] = {where:where,who:who,contact:contact,note:note,type:type};

Затем я возвращаю массив в геокод

for (var i = 0; i < addresses.length; i++) {
    geocoder2.getLocations(addresses[i].where, function(response) { //a callback
       return function(k){
       Lat[k] = response.features[0].centroid.coordinates[0];
       Lng[k] = response.features[0].centroid.coordinates[1];
       latlng = new google.maps.LatLng(Lat[k], Lng[k]);
        MarkerArray[k] = new google.maps.Marker({
          map: map,
          position: latlng,
          zIndex: k,
          title: addresses[k].who,
          icon: icons(addresses[k].type.trim())
        });}(i) // a closure function called
    });
}

Но это всегда работает на конечном индексе.Почему ??

1 Ответ

1 голос
/ 14 сентября 2010

У вас проблема замкнутого контура.Похоже, вы пытаетесь исправить это, добавив закрытие return function(k)..., но все это происходит внутри функции обратного вызова, поэтому оно не будет выполняться до тех пор, пока цикл не завершится и i не покажет свое окончательное значение.

Вы должны вытолкнуть эту обертку на уровень, чтобы она находилась прямо внутри цикла:

for (var i = 0; i < addresses.length; i++) {
    geocoder2.getLocations(addresses[i].where, function(k) { //a callback
        return function(response){
            Lat[k] = response.features[0].centroid.coordinates[0];
            Lng[k] = response.features[0].centroid.coordinates[1];
            latlng = new google.maps.LatLng(Lat[k], Lng[k]);
            MarkerArray[k] = new google.maps.Marker({
                map: map,
                position: latlng,
                zIndex: k,
                title: addresses[k].who,
                icon: icons(addresses[k].type.trim())
            });
        }
    }(i)); // binding *here* instead!
}

Или используйте Function # bind , чтобы избежать вложенной функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...