Это может быть более проблематичным. Я пытаюсь установить объект JSON в функции $.getJSON, но мне нужно иметь возможность использовать этот объект за пределами обратного вызова.
var jsonIssues = {}; // declare json variable
$.getJSON("url", function(data) {
jsonIssues = data.Issues;
});
// jsonIssues not accessible here
Аналогичный вопрос, подобный этому, был задан в другом сообщении, и консенсус заключался в том, что все, что мне нужно делать с объектами JSON, должно выполняться внутри функции обратного вызова и не может быть доступно нигде. Неужели нет способа, чтобы я мог продолжать доступ к этому объекту JSON или манипулировать им вне обратного вызова $.getJSON? Как насчет возврата переменной или установки глобального?
Буду признателен за любую помощь. Это просто не кажется правильным...
UPDATE:
Попробовал установить для параметра $.ajax() async значение false и пропустил один и тот же код без везения. Код, который я пробовал, приведен ниже:
var jsonIssues = {}; // declare json variable
$.ajax({ async: false });
$.getJSON("url", function(data) {
jsonIssues = data.Issues;
});
// jsonIssues still not accessible here
Кроме того, у меня было пару ответов о том, что глобальная переменная должна работать нормально. Я должен уточнить, что весь этот код находится в пределах $(document).ready(function() {
. Чтобы установить глобальную переменную, нужно ли просто объявить ее перед document.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 "Загружает данные синхронно. Блокирует браузер, когда запросы активны. Лучше блокировать взаимодействие с пользователем другими способами, когда необходима синхронизация.
Есть ли у кого-нибудь идея, как я должен блокировать взаимодействие с пользователем, пока это происходит? Почему это такое беспокойство? Еще раз спасибо за ответы.