Это может быть больше из общего вопроса. Я пытаюсь установить объект JSON внутри функции $ .getJSON, но мне нужно иметь возможность использовать этот объект вне функции обратного вызова.
var jsonIssues = {}; // declare json variable
$.getJSON("url", function(data) {
jsonIssues = data.Issues;
});
// jsonIssues not accessible here
Подобный вопрос, подобный этому, был задан в другом посте, и все согласились с тем, что все, что мне нужно сделать с объектами JSON, должно быть сделано в функции обратного вызова, и к нему нельзя получить доступ где-либо еще. Неужели я не могу продолжать получать доступ / манипулировать этим объектом JSON за пределами обратного вызова $ .getJSON? Как насчет возврата переменной или установки глобальной переменной?
Буду признателен за любую помощь. Это просто кажется неправильным ...
UPDATE:
Попытался установить для асинхронного значения $ .ajax () значение false и выполнить тот же код, но безуспешно. Код, который я попробовал ниже:
var jsonIssues = {}; // declare json variable
$.ajax({ async: false });
$.getJSON("url", function(data) {
jsonIssues = data.Issues;
});
// jsonIssues still not accessible here
Кроме того, я получил пару ответов о том, что глобальная переменная должна работать нормально. Я должен уточнить, что весь этот код находится в пределах $(document).ready(function() {
. Чтобы установить глобальную переменную, я должен объявить ее перед документом .ready? Как таковой:
var jsonIssues = {};
$(document).ready(function() {
var jsonIssues = {}; // declare json variable
$.getJSON("url", function(data) {
jsonIssues = data.Issues;
});
// now accessible?
}
У меня сложилось впечатление, что переменная, объявленная в document.ready, должна быть «глобально» доступной и изменяемой в любой части document.ready, включая подфункции, такие как функция обратного вызова $ .getJSON. Возможно, мне нужно прочитать о области видимости переменных javascript, но, похоже, не так легко добиться того, к чему я стремлюсь. Спасибо за все ответы.
ОБНОВЛЕНИЕ № 2:
В комментариях к ответам ниже я использовал $ .ajax вместо .getJSON и добился желаемых результатов. Код ниже:
var jsonIssues = {};
$.ajax({
url: "url",
async: false,
dataType: 'json',
success: function(data) {
jsonIssues = data.Issues;
}
});
// jsonIssues accessible here -- good!!
Пара последующих комментариев к моим ответам (и я ценю их все). Моя цель в этом состоит в том, чтобы сначала загрузить объект JSON со списком проблем, которые пользователь затем может удалить и сохранить. Но это делается с помощью последующих взаимодействий на странице, и я не могу предвидеть, что пользователь захочет сделать с объектом JSON в обратном вызове. Отсюда необходимость сделать его доступным после завершения обратного вызова. Кто-нибудь видит недостаток в моей логике здесь? Серьезно, потому что может быть что-то, чего я не вижу ...
Кроме того, я читал документацию по .ajax () jQuery, в которой говорится, что установка async в значение false "Загружает данные синхронно. Блокирует браузер, когда запросы активны. Лучше блокировать взаимодействие с пользователем другими способами, когда необходима синхронизация. "
У кого-нибудь есть идея, как я должен блокировать взаимодействие с пользователем, пока это происходит? Почему это так беспокоит? Еще раз спасибо за все ответы.