2015-12-09 3 views
2

Я использую API JS-карт Google для геокодирования некоторых адресов, но мне нужно иметь доступ к ряду переменных внутри обратного вызова функции геокодирования. Геокодер является асинхронной функцией.Как передать переменные асинхронной функции обратного вызова, которая останется неизменной?

Мой код выглядит следующим образом:

for (var prop in markerData) { 
    geocoder.geocode({ address: addressData }, function(results, status) { 
     if (status == 'OK') { 
      lat = results[0].geometry.location.lat(); 
      lng = results[0].geometry.location.lng(); 

      console.log(addressData); 

      markerInfo = { 
       lat: lat, 
       lng: lng, 
       firstname: markerData[prop].firstname, 
       lastname: markerData[prop].lastname, 
       company: markerData[prop].company, 
       addressFormatted: addressData, 
       street: markerData[prop].street, 
       city: markerData[prop].city, 
       postcode: markerData[prop].postcode, 
       telephone: markerData[prop].telephone 
      } 

      markers[i] = new google.maps.Marker({ 
       map: map, 
       position: {lat: lat, lng: lng}, 
       title: markerData[prop].firstname + ' ' + markerData[prop].lastname, 
       markerInfo: markerInfo 
      }); 

      markers[i].addListener('click', function() { 
       updateInfo(this.markerInfo); 
      }); 

      $.get('cache.php', { 
       address: addressData, 
       lat: lat, 
       lng: lng 
      }); 
     } 
    }); 
} 

addressData всегда значение последнего вхождения markerData. markerData данные, безусловно, правильные.

Мне нужен способ передачи как addressData, так и markerData функции geocoder.geocode, которая будет доступна внутри обратного вызова.

+0

Вы можете окружить вызов с IIFE. Таким образом, передаваемая переменная останется прежней. – Arg0n

+0

Я не уверен, почему это было отмечено как дубликат, особенно со связанным вопросом. Это другая проблема, встречающаяся при разных обстоятельствах. Просто потому, что проблема имеет один и тот же ответ, не делает его дублирующимся вопросом. – Mike

ответ

2

Пример моего комментария:

for (var prop in markerData) { 
    (function(addressData){ 
     geocoder.geocode({ address: addressData }, function(results, status) { 
      //Other code 
     }); 
    })(addressData); 
} 
+0

Это работает отлично. Никогда не слышал о IIFE раньше, прочитает об этом. спасибо – Mike

Смежные вопросы