Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Видимость переменной при асинхронном запросе. Как передать и получить значение? (https://javascript.ru/forum/misc/50923-vidimost-peremennojj-pri-asinkhronnom-zaprose-kak-peredat-i-poluchit-znachenie.html)

Stroganov Ilya 17.10.2014 00:12

Видимость переменной при асинхронном запросе. Как передать и получить значение?
 
Не силен в Аяксе.
Понял что дело в callback, но как реализовать не знаю, подскажите.
Имеем код (подключена библиотека работы с Яндекс Картами)

var coordinats;
var myGeocoder = ymaps.geocode("Москва");

myGeocoder.then(
    function (res) {
        coordinats = res.geoObjects.get(0).geometry.getCoordinates();
        alert('Координаты объекта :' + coordinats); // здесь всё верно, на экран получаю координату
    }  
);

// Как за пределами фунцции получить доступ к переменной coordinats ?
// Чтобы вызвать так?

alert('И тут Координаты объекта :' + coordinats);


Спасибо!

danik.js 17.10.2014 00:27

Вас где штампуют ))
Не совру, если скажу что твой вопрос при мне задается где-то 15й раз :D

danik.js 17.10.2014 00:28

Чувак, запрос на сервер занимает некоторое время.
Гугли метод, который обращается в будущее и вытягивает оттуда значение переменной.

danik.js 17.10.2014 00:30

Это как отправить ребенка за молоком, поймать его на пороге, когда он только собрался выйти, и трясти, требуя молоко ))
Ну а че. За молоком отправил? Отправил. Где молоко? Не успел еще сходить? А не волнует ))

Stroganov Ilya 17.10.2014 00:41

Цитата:

Сообщение от danik.js (Сообщение 336142)
Чувак, запрос на сервер занимает некоторое время.
Гугли метод, который обращается в будущее и вытягивает оттуда значение переменной.

Чувак, я тебя понял. И примерно понимаю что искать. И что ответ многим очевиден.
Но тыкни пальцем где есть ответ, коли такой шустрый. Дай ссылку, а лучше поправь код. Я искал, честно!

danik.js 17.10.2014 00:50

Я же объяснил - два эти участка кода разнесены по времени.
Ты хотя бы на порядок всплытия алертов обрати внимание. А ведь тот алерт, который работает, всплывает сразу как только у тебя стали известны координаты, то есть до этого момента нет никаких координат.

Вывод - юзай координаты именно в том месте. Если вопрос в организации кода, то пожалуйста: вынеси код в отдельную функцию, но вызывай ее именно из then(), в callback-функции.

Stroganov Ilya 17.10.2014 16:42

Скорректировал код.
Но всё равно не так как надо. Прошу помочь.

var coords;
var x;
var y;

function init(callback) {   
 
var myGeocoder = ymaps.geocode(city);
myGeocoder.then(
    function (res) {
        coords = res.geoObjects.get(0).geometry.getCoordinates();
        x = coords[0]; // это значение x надо передать дальше
        y = coords[1]; // это значение y надо передать дальше
		
		// Метка 1.
		alert("Коорд х = " + x + "Коорд y = " + y); //  <-- тут сейчас получаем верные желаемые значения
        callback(x,y);
    }
    
);

	// Метка 2.
   x = "59.76";
   y = "30.64";
} 


ymaps.ready(function () {
	
	init(function() {
		alert("Коорд х = " + x + "Коорд y = " + y); //  <-- тут сейчас ТАКЖЕ получаем верные желаемые значения из Метки 1
	});

    var myMap = window.map = new ymaps.Map('YMapsID', {
            center: [x,y], // <- сюда надо передать наши значения x и y из Метки 1. Но мы получаем значения из Метки 2. Что исправить?
            zoom: 9,
            behaviors: ['default', 'scrollZoom']
        });

});

danik.js 17.10.2014 17:18

И опять ты пытаешься использовать значения, которые еще не успел получить. Ты можешь использовать только те значения, которые у тебя есть на данный момент. Если ты не можешь создать ymaps.Map не получив какие-то значения, то ... гм.. ты не можешь создать ymaps.Map не получив их. Странно, получилась очевидная закономерность. Только почему она не очевидна тебе?

danik.js 17.10.2014 17:19

Ты понимаешь термин "асинхронный"?

danik.js 17.10.2014 17:22

Цитата:

Сообщение от Stroganov Ilya
<-- тут сейчас ТАКЖЕ получаем верные желаемые значения из Метки 1

Ну неужели надо много ума, чтобы переместить в это место свой new ymaps.Map() ?


Часовой пояс GMT +3, время: 12:19.