JavaScript получает переменную из одной функции в другую - PullRequest
1 голос
/ 17 января 2012

У меня проблемы с передачей двух координат из одной функции в другую.Я действительно не знаю JavaScript, но, похоже, это немного правильно.Не могли бы вы сообщить мне, где моя ошибка?

        <script type="text/javascript"> 

        function initialize() {
            var address = "Chicago IL";
            locs= getLatLong(address);

            alert(locs.lat()); //does not work
            var myOptions = {
                zoom: 4,
                center: new google.maps.LatLng(41, -87),
                mapTypeId: google.maps.MapTypeId.ROADMAP          
            };

            var map = new google.maps.Map(document.getElementById('map_canvas'),
            myOptions); 
        }

        function getLatLong(address){
            var geo = new google.maps.Geocoder;
            geo.geocode({'address':address},function(results, status){
                if (status == google.maps.GeocoderStatus.OK) {

                    locations[0] = results[0].geometry.location.lat(); 
                    locations[1] = results[0].geometry.location.lng();                  

                    //alert(locations[0]); //test is good- works! Need to pass it back to function
                    //alert(locations[1]); //test is good- works! Need to pass it back to function
                    locs =results[0].geometry.location; 
                    return locs;                
                } else {
                    alert("Geocode was not successful for the following reason: " + status);
                }
            });
        }
    </script>

1 Ответ

2 голосов
/ 17 января 2012

Невозможно вернуть значение из асинхронной функции. Не пытайтесь.

Вместо этого используйте обратный вызов.

function setLocationOnMap(locs) {
    alert(locs.lat()); // works now!
    var myOptions = {
        zoom: 4,
        center: new google.maps.LatLng(41, -87),
        mapTypeId: google.maps.MapTypeId.ROADMAP          
    };
    var map = new google.maps.Map(document.getElementById('map_canvas'), myOptions); 
}

function initialize() {
    var address = "Chicago IL";
    getLatLong(address, setLocationOnMap);
}

function getLatLong(address, callback){
    var geo = new google.maps.Geocoder;
    geo.geocode({'address':address},function(results, status){
        if (status == google.maps.GeocoderStatus.OK) {
            // processing...
            locs = results[0].geometry.location; 

            callback(locs);
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
}

Вы должны понимать, что асинхронные вызовы функций, такие как geo.geocode(), возвращаются немедленно, т. Е. До того, как результат будет готов. Вот почему вы не можете использовать return для получения значения от них - у них его пока нет.

Как только результат (чаще всего HTTP-запрос) готов, асинхронная функция полагается на функцию обратного вызова для его обработки. Вы должны выполнить всю вашу дальнейшую обработку в этой функции обратного вызова, либо напрямую, либо путем вызова другой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...