2014-01-27 2 views
1

В этом коде:Как получить доступ к переменной функции callbak глобально в JQuery

$(document).ready(function() { 
     var lat = 0; 
     var lng = 0; 
     function getLatLng(address) { 
      var geocoder = new google.maps.Geocoder(); 
      geocoder.geocode({'address': address}, function(results, status) { 
       if (status == google.maps.GeocoderStatus.OK) { 
        lat = results[0].geometry.location.lat(); //how do I access lat 
        lng = results[0].geometry.location.lng() //and lng outside function ormake it global 
       } 
      }); 
      alert(lat); // does not display only show's the 0 
     } 
     getLatLng(); 
    }); 

Я хочу, чтобы показать alert(lat) лат не равен нулю.

Как я могу получить к нему доступ?

благодарит заранее!

+2

Предупреждение не внутри функции обратного вызова, так что это на самом деле работает, что * до * завершения вызова геокода. Переместите его на 1 строку. – Archer

+2

У вас уже есть доступ к 'lat'. Проблема в том, что вызов «geocode» выполняется асинхронно и еще не завершен, когда выполняется «предупреждение». Вы не можете обойти это с помощью грубой силы: невозможно напечатать результат, прежде чем вы его получите. – Jon

+0

geocoder.geocode() - это асинхронный процесс, поэтому вам нужно активировать функцию обратного вызова. –

ответ

4

Рассмотрите возможность использования функции обратного вызова при работе с асинхронными операциями:

function getLatLng(address, callback) { 
    var geocoder = new google.maps.Geocoder(); 
    geocoder.geocode({'address': address}, function (results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      lat = results[0].geometry.location.lat(); //how do I access lat 
      lng = results[0].geometry.location.lng() //and lng outside function ormake it global 
      callback(lat, lng); 
     } 
    }); 
} 

getLatLng(function(lat, lng) { 
    alert([lat, lng]); 
}); 
+0

Спасибо, что это сработало для меня – sandip

0

Это потому, что alert(lat); выполняется до функции успеха. Вы должны предупредить об этом либо внутри функции обратного вызова, либо использовать setTimeout и дать предупреждение.

Плохая практика использования setTimeout, поскольку мы никогда не знаем, сколько времени потребуется для выполнения вызова на стороне сервера. Поэтому лучше использовать код в функции обратного вызова для обеспечения изменений

+0

+1 для краткого объяснения характера асинхронных вызовов, но -1 для даже рассмотрения использования 'setTimeout'. Как долго длится звонок? – Archer

+0

'setTimeout' - плохой шаблон для такого рода операций. – hsz

1

Ваш alert печатает 0, потому что он запущен до geocoder заканчивает свою работу. Вы можете использовать функцию обратного вызова, чтобы получить уведомление, когда geocoder отделки:

$(document).ready(function() { 
    var lat = 0; 
    var lng = 0; 
    var geocoderFinished = function(){ 
     alert(lat); 
    }; 
    function getLatLng(address) { 
     var geocoder = new google.maps.Geocoder(); 
     geocoder.geocode({'address': address}, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
       lat = results[0].geometry.location.lat(); //how do I access lat 
       lng = results[0].geometry.location.lng() //and lng outside function ormake it global 
       geocoderFinished(); 
      } 
     }); 
    } 
    getLatLng(); 
}); 
+0

это не работает! – sandip

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