2012-06-14 3 views
0

Следующая переменная my_cords не определена, когда она попадает на функцию Google Maps, может ли кто-нибудь понять, почему и возможно дать мне работу? Я определил его на самом верху и установить его внутри функции обратного вызова, который я видел работу глобальных переменных до ..Очень странная проблема с Javascript

$(document).ready(function() { 

var my_cords; 
var map; 

function getCareHome() { 

    geocoder = new google.maps.Geocoder(); 

    //var address = document.getElementById("address").value; 

    var address = "address here"; 

    geocoder.geocode({ 'address': address}, function(results, status) { 

     if (status == google.maps.GeocoderStatus.OK) { 

      my_cords = results[0].geometry.location; 

     } else { 

      alert("Sorry we couldn't locate the carehome on the map: " + status); 
      return false; 

     } 

    }); 



    var myOptions = { 
     zoom: 7, 
     center: my_cords, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    } 

    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 

} 

getCareHome(); 

}); 

ответ

3

.geocode асинхронный вызов.

Попробуйте использовать обратные вызовы в функции.

Например:

geocoder.geocode({ 'address': address}, function(results, status) { 

    if (status == google.maps.GeocoderStatus.OK) { 

     createMap(results[0].geometry.location); 

    } else { 

     alert("Sorry we couldn't locate the carehome on the map: " + status); 
     return false; 

    } 

}); 

var createMap = function(my_cords) { 
    var myOptions = { 
     zoom: 7, 
     center: my_cords, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    } 

    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 
} 
+0

Не рекомендуется использовать форму 'var createMap = function ...'. Кроме этого, +1. –

+0

@ T.J.Crowder lol, как еще вы бы создали обратный вызов? – Neal

+0

@ Neal: 'function createMap' Я бы использовал объявление функции, поскольку OP имеет' getCareHome', а не выражение функции. –

4

geocoder.geocode является асинхронной функцией. Анонимная функция, которая устанавливает my_cords, не запускается до тех пор, пока не произойдет какое-либо событие (возможно, появление ответа HTTP).

Переместите код, который зависит от его работы внутри этой функции.

+0

Привет, только что достал сообщение, я поднял ваш ответ, хотя! –

0

Потому что geocode бежит асинхронно, ваш код, используя my_cords позже (настройка myOptions) будет видеть значение my_cordsдо того завершения обратного вызова из geocode пробегов   — и так myOptions.center будет undefined.

Если вам нужно my_cords при настройке myOptions, вы должны переместить этот код в обратного вызова на geocode.

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