Ответ 1
Я думаю, что вы делаете это слишком сложно:)
var JSON;
$.getJSON('example.json', function(response){
JSON = response;
alert(JSON.property);
})
//feel free to use chained handlers, or even make custom events out of them!
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });
функция getJSON автоматически преобразует ваш ответ в правильный объект JSON. Не нужно разбираться.
Вы упомянули, что используете эти данные повсюду, поэтому вам придется ждать завершения вызова ajax до того, как данные будут доступны. Это означает, что вы завершаете все ваше приложение в обратном вызове getJSON
. Или используя настраиваемое событие, чтобы определить так:
var JSON;
$(window).on('JSONready', function(){
alert(JSON.property);
});
$.getJSON('example.json', function(response){
JSON = response;
$(window).trigger('JSONready');
});
$('#elem').on('click', function(){
//event likely to take place after ajax call has transpired
//it would still be better to assign this listener in a callback,
//but you can get away with not doing it, if you put in a catch
if(JSON){
alert(JSON.property);
}
});
ИЗМЕНИТЬ
После быстрой отладки в реальном времени реальной причиной недоступности данных было следующее: javascript, который использует JSON, был расположен в файле, включая документ страницы NORTH встроенного javascript, выполняющего вызов. В результате JSON не была глобальной переменной, и область действия не позволяла ее использовать. Если вам действительно нужна переменная, которая будет глобальной, поэтому ее можно использовать с встроенным JS, а также с любыми включенными js файлами, вы можете сделать это следующим образом:
(function(){
var limitedScopeVariable = 25;
window.globalScopeVariable = 30;
})();
$(function(){
alert(globalScopeVariable); //works!
alert(limitedScopeVariable); //fails!
});
РЕДАКТИРОВАТЬ 2
Как и в jQuery 3.0, функции обратного вызова отличаются: jqXHR.success(), jqXHR.error() и jqXHR.complete() методы обратного вызова удаляются с jQuery 3.0. Вы можете использовать jqXHR.done(), jqXHR.fail(), и jqXHR.always() вместо
из комментариев @mario-lurig