无法弄明白。我有一个大对象存储为JSON文件,我想访问它一次并多次使用它:
var myjson = new Object();
$.getJSON("myJSON.js", function(json) {
myjson = JSON.stringify(json);
});
$('#console').append(myjson);
这没有任何作用。我知道这是一个范围问题。我只是不知道该怎么做我想要的。我必须在$ .getJSON调用中执行所有函数,还是有办法传递我可以在整个运行时使用的对象?
答案 0 :(得分: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>