2012-02-12 3 views
1

Просто не могу понять это. У меня есть большой объект, хранящийся в виде файла JSON, и я хочу, чтобы получить доступ к нему один раз и использовать его несколько раз:Как получить данные json из файла (jQuery)

var myjson = new Object(); 
$.getJSON("myJSON.js", function(json) { 
    myjson = JSON.stringify(json); 
}); 
$('#console').append(myjson); 

Это ничего не делает. Я знаю, это проблема с областью. Я просто не знаю, как делать то, что я хочу. Должен ли я выполнять все мои функции внутри вызова $ .getJSON или есть способ передать объект, который я могу использовать во время выполнения?

+2

Fyi, вы можете написать '{}' 'вместо нового объекта()'. – ThiefMaster

+0

@ThiefMaster. Или просто удалите его ... потому что вы не можете использовать возвращаемое значение вне обратного вызова. – gdoron

+0

Да, это, конечно, лучше - но в зависимости от другого кода в приложении может быть лучше иметь пустой объект вместо 'undefined'. – ThiefMaster

ответ

4

Это проблема сферы, я знаю.

Нет, это не проблема. Это проблема с вашим пониманием того, как работает AJAX. AJAX является асинхронным. Это означает, что при отправке запроса AJAX функция, отправившая этот запрос ($.getJSON в вашем случае), немедленно возвращается. Результаты будут получены только внутри обратного вызова. Эта функция обратного вызова может быть вызвана гораздо позже. На самом деле это не зависит от вас, в какой момент в будущем это может произойти. Возможно, никогда не произойдет, если на вашем сервере произошла ошибка.

Таким образом, единственное место, где можно надежно потреблять результаты, что сервер отправляется после вызова AJAX находится внутри успеха обратного вызова:

$.getJSON("myJSON.js", function(json) { 
    // here and only here you can access the results of your AJAX call. 
    $('#console').append(JSON.stringify(json)); 
}); 

Есть некоторые ужасные вещи, которые вы могли бы сделать, как выполнять синхронные вызовы в сервер

var myjson = { }; 
$.ajax({ 
    url: 'myJSON.js', 
    dataType: 'json', 
    async: false, 
    success: function(json) { 
     myjson = JSON.stringify(json); 
    } 
}); 
$('#console').append(myjson); 

Опция async: false делает синхронный вызов. Очевидно, это полностью разрушает всю цель AJAX, так как это заморозит браузер во время этого вызова. Вы, вероятно, лучше напрямую включая myJSON.js как тег сценария:

<script type="text/javascript" src="myJSON.js"></script> 

Еще одно преимущество вы можете получить от этого подхода заключается в том, что браузер будет гарантировать вам, что этот сценарий был полностью загружен перед выполнением любых других сценариев. Таким образом, следующее может работать нормально:

<script type="text/javascript" src="myJSON.js"></script> 
<script type="text/javascript"> 
    var myjson = someJavascriptVariableThatYouDeclaredInMyJSON; 
</script> 

, а затем позже:

<script type="text/javascript"> 
    $('#console').append(JSON.stringify(myjson)); 
</script> 
+0

Возможно, вы еще не захотите еще раз подчеркнуть объект. Если вы не используете IE, вы можете прекрасно просматривать объекты на консоли - гораздо приятнее, чем непривязанная строка json. – ThiefMaster

+0

@ThiefMaster, да, это просто, что OP, похоже, пытается распечатать JSON в каком-то элементе DOM с консолью id = «' - '$ ('# console'). Append (...)'. Поэтому я предполагаю, что он нуждается в * довольно печатной * в своем HTML, а не в консоли отладки javascript. –

+0

Ой, не заметил. @philtune: у современных браузеров есть консоль, которая намного мощнее, чем div/textarea/etc. для отображения отладочной информации. – ThiefMaster