2015-02-16 2 views
0

поэтому я пытаюсь вызвать геокодер google, чтобы получить некоторые значения, но я не совсем понимаю, что могу и не могу сделать в рамках асинхронных функций. Существует еще один пример того, и это помогло мне установить это, как это так, но я до сих пор не могу понять, как получить эти значения в массивасинхронные функции javascript

Вот мой призыв к геокодеру:

function getLng(name,func){ 
    geocoder.geocode({'address': name}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     func(results[0].geometry.location.lng()); 
     } else { 
     alert("Something got wrong " + status); 
     } 
    }); 
} 

здесь построение массива, используя значения геокодирование:

('.action').click(funciton(){ 
    var homes =[]; 
    homes.push({name: Name, 
       type: "dwelling", 
       lat: getLat(Name, function(location){return location;}), 
       lng: getLng(Name, function(location){return location;}) 
      }); 
    console.log(homes); 
}); 

Искреннее спасибо за любую помощь ... Это сильно appriciated.

+0

вы сделали это работает? – Ethaan

ответ

0

Асинхронные функции не возвращают результат немедленно, они обычно работают путем испускания событий, передачи обратного вызова в качестве аргумента или возврата объекта обещания. В вашем примере вы передаете обратный вызов, который возвращает свой аргумент в пустоту.

Также вы не захотите дважды обращаться к API геокодирования для того же адреса.

Лучше функция объявить бы:

function getGeoLocation(address, onDoneCallback) { ... } 
... 
var homes = []; 
getGeoLocation(some_address, function(loc) { 
    homes.push({lat : loc.lat, lng : loc.lng}); 
}); 

Надеется, что это помогает.

+0

Это не так прямолинейно, как это. OP пытается создать объект 'homes' с большим количеством адресов, чем только адрес lat/long. Они также хотят сохранить адрес и тип адреса в объекте слишком – jasonscript

+0

спасибо большое @G Рой. Это входило в пустоту. И ха-ха, я говорю об этом три раза здесь (но вы правы, один из тех времен не нужен). То, что я делаю, это получить позицию щелчка, затем получить город щелчка, а затем снова позвонить получить центр этого города или что-то еще (я оставил много кода). Спасибо за помощь ! – ambe5960

0

Использование методов async означает драматическое переосмысление того, как вы кодируете свои события. Использование async означает, что код никогда не ждет завершения метода, вместо этого он немедленно переходит к следующей строке. Это означает, что вам необходимо переместить код назначения (homes = ...) в обработчики успеха.

Обратите внимание, что событие click теперь ограничено только вызовом функции getGeoCoords. Эта функция теперь имеет метод обратного вызова, называемый onSuccess, который отвечает за строительство homes объекта на основе результатов запроса асинхронной

var homes = []; 

('.action').click(function(){ 
    getGeoCoords(Name, 'dwelling'); 
}); 

function getGeoCoords(name, type){ 

    var onSuccess = function(results){ 
     var home = {}; 

     home.name = name;     // getGeoCoods parameter 'name' 
     home.type = type;     // getGeoCoods parameter 'type' 
     home.lat = results.lat;   // result of async query 
     home.lng = results.lng;   // result of async query 

     homes.push(home);     // push object to global array 
    } 

    geocoder.geocode( 
     {'address': name},     // async query options 
     onSuccess       // success callback 
    ); 
} 
+0

@ ambe5960 отлично! Если этот ответ помог вам, отметьте его – jasonscript

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