Нужна помощь с переменной областью в Javascript

У меня есть следующая функция 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;
}

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

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

7
задан Misha Moroshko 17 August 2010 в 10:43
поделиться

3 ответа

На самом деле это не проблема области видимости, а тот факт, что $. 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 заблокирует браузер пользователя.

5
ответ дан 7 December 2019 в 09:55
поделиться

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

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

На самом деле проблема заключается в том, что возвращаемые группы выполняются до завершения $. GetJSON () . Поскольку он создает запрос ajax, он запускается асинхронно.

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

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
});
1
ответ дан 7 December 2019 в 09:55
поделиться

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

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

  1. get_groups enterd
  2. запрашивает URL-адрес и регистрирует обратный вызов
  3. возвращает группы
  4. конец триггера "get_groups"
  5. callback
  6. anynomous callback-function enterd
  7. modifie groups-array
  8. конец anynomous callback-function

вы не можете напрямую вернуть модификации callback-функции.

0
ответ дан 7 December 2019 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: