2014-01-27 70 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'調用異步運行,並且在執行'alert'時尚未完成。你無法用蠻力來解決這個問題:在收到結果之前打印結果是不可能的。 – 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