Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.03.2013, 17:43
Интересующийся
Отправить личное сообщение для MatrixGru Посмотреть профиль Найти все сообщения от MatrixGru
 
Регистрация: 06.03.2013
Сообщений: 10

Асинхронные функции
Имеется функция получения адреса по координатам из Яндекс, карт.
Функция работает асинхронно. Не получается дождаться получения адреса, может можно, как то перевести в синхронный режим работы или дождаться получения адреса и после выйти из функции.

Вызов делаю следующим образом: 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;
}
Ответить с цитированием
  #2 (permalink)  
Старый 09.03.2013, 19:45
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

С асинхронностью схема работы другая. Допустим у нас все работает синхронно. Мы делаем так:

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);
Ответить с цитированием
  #3 (permalink)  
Старый 09.03.2013, 22:10
Интересующийся
Отправить личное сообщение для MatrixGru Посмотреть профиль Найти все сообщения от MatrixGru
 
Регистрация: 06.03.2013
Сообщений: 10

Огромное спасибо!!!

То, что надо !!!
Ответить с цитированием
  #4 (permalink)  
Старый 17.08.2013, 21:52
Новичок на форуме
Отправить личное сообщение для Betankor Посмотреть профиль Найти все сообщения от Betankor
 
Регистрация: 17.08.2013
Сообщений: 1

Подскажите тогда пожалуйста. Я хочу, чтобы в зависимости от типа входного аргумента координаты либо брались в виде массива из двух элементов, либо перекодировались из адреса в массив.
Код такой:
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". То есть задача в том, чтобы мне результат асинхронной функции записать в переменную. Помогите пожалуйста, если можете. Заранее спасибо.

Последний раз редактировалось Betankor, 17.08.2013 в 21:58.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установить имя конструктора Андрей Параничев Общие вопросы Javascript 8 17.11.2011 10:09
Как в браузерах реализуются функции DOM (например createElement) iamme Общие вопросы Javascript 7 02.09.2011 20:26
динамическое содержимое функции alfmaster Общие вопросы Javascript 2 28.05.2011 17:10
arguments вызвавшей функции mister_maxim Общие вопросы Javascript 4 12.10.2010 16:21
Подскажите, как работает простой код (замыкание функции)? Dotod Общие вопросы Javascript 5 02.12.2009 04:03