我有2个函数,函数A调用函数B对地址进行地理编码并将LatLng对象返回给函数A但不知何故,函数A不等待函数B从Google返回结果。
function A() {
var address = document.getElementById("txtbox").value;
//geocoding here
var here = B(address);
if (here == null) {
console.log("seems like geocode didn't work, defaulting value");
和功能B
function B(address) {
var here;
geocoder = new google.maps.Geocoder();
geocoder.geocode( { 'address': address}, function(results, status) {
console.log("geocoding");
if (status == google.maps.GeocoderStatus.OK) {
console.log(results[0].geometry.location);
currentlatlng = results[0].geometry.location;
lng = currentlatlng.lng();
lat = currentlatlng.lat();
here = new google.maps.LatLng(lat, lng);
} else {
console.log("Geocode was not successful for the following reason: " + status);
}
});
return here;
}
但似乎控制台的输出是
seems like geocode didn't work, defaulting value
geocoding
因此,似乎函数A调用函数B然后继续它。
我认为它会等待,但是根据我对google maps api如何工作的理解,它本身并没有“等待”,所以我该怎么办?
答案 0 :(得分:6)
您的地理编码功能是异步的。它不等待。它的结果来自Ajax调用(“Ajax”中的“A”代表异步)。
您无法以同步方式使用异步函数进行编程。相反,您必须使用异步技术。在这种情况下,您获取地理编码信息后要运行的任何代码必须在地理编码操作的完成处理程序中执行或调用。您无法在B()
之后执行此操作。您必须在B()
内的完成处理程序中执行它。
如果您希望能够将B()
用于多种用途,那么您可以将回调传递到B()
并在地理编码数据可用时调用该回调。
function A(){
var address = document.getElementById("txtbox").value;
//geocoding here
B(address, function(geocodeData) {
// use geocode data here
});
}
function B(address, callback){
var geocoder = new google.maps.Geocoder();
geocoder.geocode( { 'address': address}, function(results, status) {
console.log("geocoding");
if (status == google.maps.GeocoderStatus.OK) {
console.log(results[0].geometry.location);
var currentlatlng = results[0].geometry.location;
var lng = currentlatlng.lng();
var lat = currentlatlng.lat();
var here = new google.maps.LatLng(lat, lng);
// call your callback here and pass it the data
callback(here);
}else {
console.log("Geocode was not successful for the following reason: " + status);
}
});
}
仅供参考,你的变量应该被声明为局部变量(前面有var
),这在异步函数中更为重要。
答案 1 :(得分:0)
B
进行异步调用,这意味着无法保证执行顺序。最好的办法是,在A
中注册的回调函数中初始化here
之前,执行将在B
(长)中进行测试。
基本上,在here
初始化之后,必须从回调内部调用here
所需的任何内容。看看jquery,这是一个跨浏览器的js库,它使用Deferred
对象形式化这种延迟执行模式。特别是它带有ajax
方法,用户可定义的回调调用成功和失败。