Клуб API Карт

Как использовать координаты, полученные через ymaps.geocode, вне функции?

Пост в архиве.
JoK781
28 января 2014, 15:47

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

Пример:

ymaps.geocode(znach[i]).then(function (res) {

moscowCoords = res.geoObjects.get(0).geometry.getCoordinates();

x = moscowCoords[0];
y = moscowCoords[1];
});

 

Вот как использовать x,y вне функции? Пробовал объявлять их как глобальные, все равно undefined. JS толком не знаю, просто иногда бывает необходимость его использовать, поэтому может быть ответ и на поверхности, но я не понимаю все равно =) надеюсь на вашу помощь, спасибо.

3 комментария

 

JS толком не знаю

Очевидно, все дело в этом.

Со знанием js придет ответ на этот простой вопрос.

 

По существу, http-запросы (а именно это делает метод geocode) в Javascript выполняются асинхронно,

и это великое благо в сравнении с каким-нибудь ПэХаПэ, где весь ваш остальной код ждет когда будет получен ответ.

Здесь же он работает и делает чтото полезное, а при получении ответа, начинает его обрабатывать.

 

Как вариант вы можете использовать промисы, но нужные данные будут доступны также только внутри обработчика (функции)

ymaps.geocode(znach[i])

    .then(function (res) {

        return res.geoObjects.get(0).geometry.getCoordinates();

    })

    .then(function (coords) {

        x = coords[0];

        y = coords[1];

    });

Спасибо за ответ, но проблемы он не решает по-моему. Тогда другой вопрос, собственно в чем суть проблемы. У меня есть файл, где подряд записаны адреса объектов 4х типов, я должен их отобразить на карте как в этом примере http://api.yandex.ru/maps/jsbox/object_list 

 

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

Проблемы здесь нет, есть неправильная логика приложения

Представьте что вам надо отобразить то что ввел пользователь,

но он пока ничего не печатал, а может и не будет печатать, а может напечатает через 10 минут... Очевидно что тут абсолютно тоже самое. Вы хотите работать с данными которые еще не доступны.


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

Прогеокодируйте ваши адреса на сервере один раз, запишите координаты в БД/файл/_куда_то_еще_ и создавайте метки по координатам (синхронно)