Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   JavaScript: функция возвращает undefined. Подскажите где я туплю (https://javascript.ru/forum/misc/42917-javascript-funkciya-vozvrashhaet-undefined-podskazhite-gde-ya-tuplyu.html)

fluffyMan2000 13.11.2013 21:48

JavaScript: функция возвращает undefined. Подскажите где я туплю
 
Добрый день.

JavaScript разработчики - откликнитесь))

Пишу некую картографическую программу. Связка javascript/qwebkit/qt. Использую yandex maps api 2.0.

Есть функция, которая должна возвращать адрес по координатам, но она возвращает undefined. В джаваскрипте не силён, прошу помощи, почему такое поведение?
Код:

function getAddressByCoordinates(lat, lon)
{       
    var res;
               
    ymaps.geocode([lat, lon]).then(function (res)
    {
        var names = [];

        res.geoObjects.each(function (obj)
        {
            names.push(obj.properties.get('name'));
        });
                                       
        res = names.reverse().join(', ');
                                       
        console.log(res);                                                               
    });
                               
    return res;
}

При чем текущий вывод на консоль показывает определенный адрес. если поставить вывод на консоль перед return - то undefined

что не так с областью видимости переменной res?

jsru_ 13.11.2013 22:37

походу У тебя изменяется рес тот что сидит в параметре а не в замыкании

var a = 1;
(function (a) {
 a = 2;

})(a)

alert(a);

var a = 1;
(function () {
 a = 2;

})()

alert(a);

fluffyMan2000 13.11.2013 22:51

Не совсем понимаю, как в моем случае правильно возвратить результат? Почему из этой функции-замыкания я не могу присвоить значение локальной переменной?

fluffyMan2000 13.11.2013 22:51

В смысле поменять название локальной переменной? Да пробовал, результат то же

jsru_ 13.11.2013 22:54

вообщем убери res отсюда then(function (res) и будет вот так then(function ()

fluffyMan2000 13.11.2013 23:17

Цитата:

Сообщение от jsru_ (Сообщение 280932)
вообщем убери res отсюда then(function (res) и будет вот так then(function ()

Этого делать нельзя. Этот параметр нужен. В нем хранятся geoobjects. В общем так в примерах Яндекс масс апи было.

fluffyMan2000 13.11.2013 23:23

function getAddressByCoordinates(lat, lon)
{	 
    var resss;
		
    ymaps.geocode([lat, lon]).then(function (res) 
    {
        var names = [];

        res.geoObjects.each(function (obj) 
	{
            names.push(obj.properties.get('name'));
        });
					
	res = names.reverse().join(', ');
					
	resss = res;

        console.log(ress); // выводится адрес
    });

    console.log(ress); // выводится undefined
				
    return resss;
}


Rise, То же самое

fluffyMan2000 13.11.2013 23:26

Вложений: 1
Вот исходник. Посмотрите пожалуйста.

Препарируемая функция в конце файла

a_l 14.11.2013 08:55

fluffyMan2000, ошибка в том, что вы пытаетесь работать с ассинхронными методами как с синхронными. Почитайте про ассинхронность js и всё встанет на свои места.

fluffyMan2000 14.11.2013 09:56

Цитата:

Сообщение от Rise (Сообщение 280951)
function getAddressByCoordinates(lat, lon)
{	 
		
    ymaps.geocode([lat, lon]).then(function (res) 
    {
        var names = [];

        res.geoObjects.each(function (obj) 
	{
            names.push(obj.properties.get('name'));
        });
					
	res = names.reverse().join(', ');

	callback(res);
					
    });
				
}

function callback(res) {
	alert(res);
}

Поймите, мне нужно возвратить результат из функции getAddressByCoordinates(lat, lon). Да, в Вашем варианте колбэк показывает значение, но как это значение возвратить во внешний мир?? то есть вызывая getAddressByCoordinates() я должен получить строку с адресом. или какимлибо другим способом мне надо получить строку с адресом ВО ВНЕШНИЙ МИР. джаваскрипт в моей программе исполняется в webView и из него надо достать значение строки. не могу понять джаваскрипт вобще.

В нем что, затираются ГЛОБАЛЬНЫЕ переменные, когда функция завершается (пробовал в колбэке присваивать значение глобальное переменной, а потом вывести ее значение из другого места программы - undefined)?


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