Цитата:
Да у вас все правильно сделано в коде, просто нельзя так делать в применении - возвращать то, чего еще нет в этот момент. Передавайте действие прямо в ту самую функцию, или в ней попросту делайте то, что требуется - ну внутри, где алерт вовремя срабатывает. |
Вложений: 1
Цитата:
Иллюстрация во вложении. В качестве подтверждения утверждения выше пруф https://www.google.ru/search?newwind...92.3ZEe8yb1WZ4 |
Сделал так:
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true"></script>
<script type="text/javascript">
function codeAddress(address, fn) {
geocoder = new google.maps.Geocoder();
geocoder.geocode( { 'address': address}, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
myylocation = results[0].geometry.location;
lat = myylocation.lat();
lng = myylocation.lng();
fn(lat,lng);
}
});
}
var latlng;
codeAddress('moskva', function (){
latlng = lat +','+ lng;
alert(latlng); // тут есть
});
alert(latlng); // тут undefined
Но опять мимо. Вот жеж зраза такая... |
Еще чуть-чуть допилить надо. Откуда возьмутся lat +','+ lng внутри function (){ ? Снаружи функции их нет чтоб она их увидела. Внутри другой функции она их не видит само собой. Это значит что их надо добавить аргументами:
function (lat,lng){
/* тут все по тексту */
}
|
Цитата:
Когда внутри одной функции вы пишите вот так lat = myylocation.lat(); то делаете переменную lat - "глобальной", то есть свойством объекта window. В явной форме строка вот так выглядит window.lat = myylocation.lat(); поэтому в другой функции без передачи аргументов все "видно". Но алерт все равно не будет работать. Потому что это бред. Алерту нечего показывать в тот момент, а когда тот момент настал - алерт уже прошел и покажет в следующий раз то, что было в прошлый. |
Короче говоря как вы захотели - сделать невозможно. Упростим:
var latlng=null;
setTimeout(function(){ latlng='100.100'; }, 1);
alert(latlng); // выведет "null"
Почему? Потому что алерт выполнится раньше чем безымянная функция присвоит переменной latlng новое значение, даже при таком микроскопическом сдвиге времени в 1мс. Второе, даже если та самая функция определения координат занимает еще меньше времени, алерт все равно покажет нулл, просто потому что он находится на прямой, а та функция - в ответвлении, то есть на кривой. В таких случаях всегда приходится перестраивать логику и мышления и приложения чтобы воспользоваться результатом, который вычисляется не сейчас, и не в этом месте, а позже и в другом месте. Решение для таких случаев весьма простое: это самое решение перемещается из сейчас и тут - в тогда и там. То есть туда где появляется результат перемещается и получатель этого результата. Когда вы делаете алерт там - он работает? Потому что он перемещен в то самое время и место, и конечно работает. А другой алерт - из сейчас и тут - никогда не будет работать как вы хотите. Вам несколько раз объяснили что применение координат должно находиться там, где они появляются, после того как они там появляются - там где алерт который нормально показывает. Вот и все. Что вы с ними хотите сделать - делайте в любой функции и передавайте ее в будущее туда, где она получит результат после того как он появится. Все просто. |
| Часовой пояс GMT +3, время: 13:46. |