Асинхронные функции
Имеется функция получения адреса по координатам из Яндекс, карт.
Функция работает асинхронно. Не получается дождаться получения адреса, может можно, как то перевести в синхронный режим работы или дождаться получения адреса и после выйти из функции. Вызов делаю следующим образом: strAddr=GetAddress([lat,lon]) Результат всегда: undefined (что логично, т.к. не успевает отработать функция) //Функция получения адреса по заданным координатам function GetAddress(coords){ ymaps.ready(function () { //Если API готов // Отправим запрос на геокодирование ymaps.geocode(coords).then(function (res) { var names = []; // Переберём все найденные результаты и // запишем имена найденный объектов в массив names res.geoObjects.each(function (obj) { names.push(obj.properties.get('name')); }); /* Тут я могу получить адрес после успешного геокодирования */ addr=names; }); }); /* Необходимо в качестве результата работы функции получить адрес*/ return addr; } |
С асинхронностью схема работы другая. Допустим у нас все работает синхронно. Мы делаем так:
var strAddr=GetAddress([lat,lon]); alert(strAddr);// используем полученные данные Однако у нас функция асинхронная, так что получается так:
function processAddress(strAddr) {
alert(strAddr); // используем полученные данные
}
//Функция получения адреса по заданным координатам
function getAddress(coords, callback){
ymaps.ready(function () { //Если API готов
// Отправим запрос на геокодирование
ymaps.geocode(coords).then(function (res) {
var names = [];
// Переберём все найденные результаты и
// запишем имена найденный объектов в массив names
res.geoObjects.each(function (obj) {
names.push(obj.properties.get('name'));
});
/*
Тут я могу получить адрес после успешного геокодирования
*/
callback(names);
});
});
}
getAddress([lat,lon], processAddress);
|
Огромное спасибо!!!
То, что надо !!! |
Подскажите тогда пожалуйста. Я хочу, чтобы в зависимости от типа входного аргумента координаты либо брались в виде массива из двух элементов, либо перекодировались из адреса в массив.
Код такой:
YandexMapApiHelper.prototype.EncodeCoords = function (coordsOfCenter) {
var centerCoords;
if (typeof coordsOfCenter == "string") {
centerCoords = getCoordinates(coordsOfCenter, function (here) {
return here;
});
return centerCoords;
}
else if (typeof coordsOfCenter === "undefined") {
centerCoords = [56.8299, 60.5820];
return centerCoords;
} else {
centerCoords = coordsOfCenter;
return centerCoords;
}
};
function getCoordinates(coordsOfCenter, callback) {
ymaps.geocode(coordsOfCenter).then(function (res) {
var firstGeoObject = res.geoObjects.get(0).geometry.getCoordinates();
var asincCoordsOfCenter = firstGeoObject;
callback(asincCoordsOfCenter);
});
}
Не работает... уже вторую неделю мучаюсь. В дебаггере пишет "e is undefined". То есть задача в том, чтобы мне результат асинхронной функции записать в переменную. Помогите пожалуйста, если можете. Заранее спасибо. |
| Часовой пояс GMT +3, время: 05:15. |