Это проблема сферы, я знаю.
Нет, это не проблема. Это проблема с вашим пониманием того, как работает 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>
Fyi, вы можете написать '{}' 'вместо нового объекта()'. – ThiefMaster
@ThiefMaster. Или просто удалите его ... потому что вы не можете использовать возвращаемое значение вне обратного вызова. – gdoron
Да, это, конечно, лучше - но в зависимости от другого кода в приложении может быть лучше иметь пустой объект вместо 'undefined'. – ThiefMaster