Нужна помощь с переменной областью в Javascript - PullRequest
7 голосов
/ 17 августа 2010

У меня есть следующая функция Javascript, которая должна возвращать массив групп, находящихся в базе данных.Он использует $.getJSON() метод для вызова get_groups.php, который фактически читает из базы данных.

function get_groups() {
    var groups = [];

    $.getJSON('get_groups.php', function(response) {
        for (var i in response) {
            groups.push(response[i]);
        }
    }

    return groups;
}

К сожалению, эта функция не работает должным образом, потому что groups.push(response[i]); не заполняет var groups = []; (как японимаю, что он заполняет какой-то другой массив groups, возможно, глобальный).

Предполагая, что я не хочу иметь глобальную переменную groups, как бы вы решили эту проблему?

Ответы [ 3 ]

5 голосов
/ 17 августа 2010

Это не проблема области действия, это факт, что $.getJSON() является асинхронным, что означает, что эта часть выполняется после , которую вы вернете:

for (var i in response) {
  groups.push(response[i]);
}

Вам необходимо вызывать любую функцию, которой нужны эти данные, в обратном вызове асинхронного запроса, поэтому она запускается, когда данные доступны, например:

$.getJSON('get_groups.php', function(response) {
    var groups = [];
    for (var i in response) {
        groups.push(response[i]);
    }
    doSomethingThatNeedsGroups(groups);
});

В настоящее время массив групп заполняется, но не тогда, когда вам это нужно. Если у вас абсолютно есть , чтобы вернуть это (я настоятельно рекомендую использовать асинхронную модель так, как она была задумана), вы можете использовать полную версию $.ajax() и установить async:false. Опять же ... не идите по этому пути, если это возможно, придерживайтесь вызова любой функции, которая нуждается в данных, как только они станут доступны, так как async: false заблокирует браузер пользователя.

1 голос
/ 17 августа 2010

Если у вас действительно нет глобальной переменной с именем groups (что на самом деле было бы не самой лучшей идеей), вы говорите со своей "локальной" groups переменной.

Поскольку EMCA- /Javascript имеет область действия , и вы используете замыкание , у вас есть доступ к этой переменной.Таким образом, проблема здесь, не в области. Так что даже с глобальной переменной с точно таким же именем такая лексическая область будет гарантировать вам доступ к вашей локальной переменной.

Проблема в том, что return groups выполняется до того, как $.getJSON() завершится.Поскольку он создает запрос ajax, он запускается в асинхронном режиме.

Вы должны использовать callback самостоятельно для обработки данных:

function get_groups(cb) {
   var groups = [];

   $.getJSON('get_groups.php', function(response) {
       for (var i in response) {
           groups.push(response[i]);
       }
       cb.apply(null, [groups]);
   }
}

get_groups(function(groups){
   // do something with groups array
});
0 голосов
/ 17 августа 2010

"$. GetJSON ('get_groups.php', function (response) {" является функцией обратного вызова.

Изменения в массиве groups вступают в силу после обратного вызова, а также послевозвращать группы.

  1. get_groups enterd
  2. запрашивать URL и регистрировать обратный вызов
  3. возвращать группы
  4. конец "get_groups"
  5. триггер обратного вызова
  6. anynomous callback-функция enterd
  7. модифицирование массива групп
  8. конец любой аномальной функции обратного вызова

вы не можете вернутьнепосредственно изменяет функцию обратного вызова.

...