У меня есть следующая функция 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
, как бы вы решили эту проблему?
На самом деле это не проблема области видимости, а тот факт, что $. 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
заблокирует браузер пользователя.
Если у вас действительно нет глобальной переменной с именем 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
});
"$. GetJSON ('get_groups.php', function (response) {" - это функция обратного вызова.
Изменения в массив групп действует после обмана обратного вызова, а также после того, как вы возвращаете группы.
вы не можете напрямую вернуть модификации callback-функции.