crazy_str
@crazy_str
web-программист

Проблема с return?

Не могу понять в чем проблема
function getLang(lang) {
    $.getJSON(gInit['url'] + '/lang/'+getCookie('lang')+'.json', function(data) {
        var items = [];
        $.each(data, function(key, val) {
            if(key == lang) {
                items += val;
            }
        });
        return items;
    });
}

При вызове из консоли getLang("users") мне выводит undefined, в чем может быть проблема?
  • Вопрос задан
  • 233 просмотра
Решения вопроса 1
@curator
Используйте «промисы».
https://learn.javascript.ru/promise
caniuse.com/#feat=promises

https://github.com/dfilatov/vow, и т.д.

Или jQuery.Deferred:
function getLang(lang) {
    var d = $.Deferred();

    $.getJSON(gInit['url'] + '/lang/'+getCookie('lang')+'.json', function(data) {
        var items = [];
        $.each(data, function(key, val) {
            if(key == lang) {
                items.push(val);
            }
        });
        d.resolve(items);
    });
 
    return d.promise();
}

var test = getLang("users");
test.done(function (data) {
     console.log(data);
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
alsopub
@alsopub
Проблема в том что вы не до конца понимаете как работают callback функции и асинхронные вызовы.
При вызове из консоли getLang("users") вообще никаких return не срабатывает. Вызывается функция $.getJSON и все, функция getLang завершает свою работу.
Параллельно с этим выполняется запрос gInit['url'] + '/lang/'+getCookie('lang')+'.json' (он может выполняться, например, несколько секунд) и по его завершению срабатывает ваш код, вплоть до return, однако возвращать значение уже некому.
Замените return на alert или console.log и вы сами все поймете.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы