Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 16.07.2015, 17:36
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от Majax Посмотреть сообщение
то первый вызов undefined, а второй и последующие выводит значение, вообще запутался
Ну старые значения и выводятся, предыдущие то есть.

Да у вас все правильно сделано в коде, просто нельзя так делать в применении - возвращать то, чего еще нет в этот момент. Передавайте действие прямо в ту самую функцию, или в ней попросту делайте то, что требуется - ну внутри, где алерт вовремя срабатывает.
Ответить с цитированием
  #12 (permalink)  
Старый 16.07.2015, 18:01
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от Majax
Но видно мой уровень колеблется около ноля
Асинхрон и кложи озадачивают всех нормальных программистов, которые никогда сами не открывали тредов и не выделяли меморю.

Иллюстрация во вложении. В качестве подтверждения утверждения выше пруф https://www.google.ru/search?newwind...92.3ZEe8yb1WZ4
Изображения:
Тип файла: jpg closure.jpg (8.9 Кб, 8 просмотров)
Ответить с цитированием
  #13 (permalink)  
Старый 17.07.2015, 00:56
Новичок на форуме
Отправить личное сообщение для Majax Посмотреть профиль Найти все сообщения от Majax
 
Регистрация: 16.07.2015
Сообщений: 6

Сделал так:
<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


Но опять мимо. Вот жеж зраза такая...
Ответить с цитированием
  #14 (permalink)  
Старый 17.07.2015, 05:32
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Еще чуть-чуть допилить надо. Откуда возьмутся lat +','+ lng внутри function (){ ? Снаружи функции их нет чтоб она их увидела. Внутри другой функции она их не видит само собой. Это значит что их надо добавить аргументами:

function (lat,lng){
/* тут все по тексту */
}
Ответить с цитированием
  #15 (permalink)  
Старый 17.07.2015, 05:37
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от Majax
// тут есть
А, понял, ну и вы поймите что ваш этот волшебный код работает только из-за явных синтаксических ошибок, которых вы не видите.

Когда внутри одной функции вы пишите вот так

lat = myylocation.lat();

то делаете переменную lat - "глобальной", то есть свойством объекта window. В явной форме строка вот так выглядит

window.lat = myylocation.lat();

поэтому в другой функции без передачи аргументов все "видно".

Но алерт все равно не будет работать. Потому что это бред. Алерту нечего показывать в тот момент, а когда тот момент настал - алерт уже прошел и покажет в следующий раз то, что было в прошлый.

Последний раз редактировалось kostyanet, 17.07.2015 в 05:41.
Ответить с цитированием
  #16 (permalink)  
Старый 17.07.2015, 06:03
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Короче говоря как вы захотели - сделать невозможно. Упростим:

var latlng=null;

setTimeout(function(){ latlng='100.100'; }, 1);

alert(latlng); // выведет "null"


Почему? Потому что алерт выполнится раньше чем безымянная функция присвоит переменной latlng новое значение, даже при таком микроскопическом сдвиге времени в 1мс.

Второе, даже если та самая функция определения координат занимает еще меньше времени, алерт все равно покажет нулл, просто потому что он находится на прямой, а та функция - в ответвлении, то есть на кривой.

В таких случаях всегда приходится перестраивать логику и мышления и приложения чтобы воспользоваться результатом, который вычисляется не сейчас, и не в этом месте, а позже и в другом месте. Решение для таких случаев весьма простое: это самое решение перемещается из сейчас и тут - в тогда и там. То есть туда где появляется результат перемещается и получатель этого результата.

Когда вы делаете алерт там - он работает? Потому что он перемещен в то самое время и место, и конечно работает. А другой алерт - из сейчас и тут - никогда не будет работать как вы хотите.

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

Последний раз редактировалось kostyanet, 17.07.2015 в 06:06.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать значение select из формы в переменную javascript 2Step Общие вопросы Javascript 2 11.03.2014 23:11
Как передать значение переменной с ява на php wadim Общие вопросы Javascript 1 06.02.2014 00:19
как передать значение переменной в IFRAME в поле формы JS-ом из самой страницы? DeUre Общие вопросы Javascript 14 17.12.2013 16:37
Передать значение этой переменной скрипту пхп не обновляя страницы jei Общие вопросы Javascript 10 01.03.2013 18:14
как передать это значение в jquery qwertycal Общие вопросы Javascript 4 30.01.2013 18:12