@Zewkin
Я у мамы фронтэндер

Как функции в JavaScript возвращают значение?

Суть: есть json файл, в котором хранятся данные о музыкальных альбома (жанр, исполнитель и т. д.)
Пытаюсь реализовать фильтрацию: если функция вызывается без параметров, забираем все данные, какие есть. Если указана группа и не указан жанр - те, в которых упоминается группа

function getData(band, genre) {
    var result = [];
    $.getJSON("data.json", function(data) {
        if (!band && !genre) { 
            result = data
        }
        if (band !== 'undefined' && !genre) {
            for (var i = 0; i < data.length; i++) {
                if (data[i].band == band) {
                    result.push(data[i]);
                }
            } 
        }   console.log(result)
    });
}

console.log(getData('Muse'));


Так - работает, в консоли виден нужный массив данных. Если вместо console.log(result) написать return result, возвращает undefined. Что такое? Полдня мучаюсь.
  • Вопрос задан
  • 554 просмотра
Решения вопроса 1
IonDen
@IonDen
JavaScript developer. IonDen.com
В данном случае вам нужен не return. Присмотритесь внимательно, ваша функция запускает асинхронный ajax запрос, который выполняется какое-то время. А вы пытаетесь прочитать тот return что зашит в функцию по умолчанию (а он вернет undefined).

Чтобы решить вашу проблему вам нужен коллбэк, который будет вызван после загрузки данных, например так:
function getData(band, genre, callback) {
    var result = [];
    $.getJSON("data.json", function(data) {
        if (!band && !genre) { 
            result = data
        }
        if (band !== 'undefined' && !genre) {
            for (var i = 0; i < data.length; i++) {
                if (data[i].band == band) {
                    result.push(data[i]);
                }
            } 
        }

        callback(result); // вот тут мы передаем загруженное значение
    });

    return undefined; // а вот тут на самом деле расположен тот return, который функция вызовет синхронно
}

function readResult (result) {
    console.log(result);
}

getData('Muse', null, readResult)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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