Javascript 如何将XMLHttpRequest的输出存储在全局变量中
我有一个网页,可以通过Javascript 如何将XMLHttpRequest的输出存储在全局变量中,javascript,json,Javascript,Json,我有一个网页,可以通过XMLHttpRequest加载几个JSON文件 我想加载文件,解析JSON,并将输出存储在一个全局可访问的变量中。 完成foo和bar后,我才想调用success()函数。到目前为止,我的脚本有两个问题需要帮助 1:我无法将变量设置为loadJSON()的输出。我猜我的返回语句有点古怪?我什么都试过了。。。帮忙 2:仅在设置了foo和bar之后,如何调用success() var foo; var bar; function initSession(){ fo
XMLHttpRequest
加载几个JSON
文件
我想加载文件,解析JSON
,并将输出存储在一个全局可访问的变量中。完成
foo
和bar
后,我才想调用success()
函数。到目前为止,我的脚本有两个问题需要帮助
1:我无法将变量设置为loadJSON()
的输出。我猜我的返回语句有点古怪?我什么都试过了。。。帮忙
2:仅在设置了foo
和bar
之后,如何调用success()
var foo;
var bar;
function initSession(){
foo = loadJSON("foo.js");
bar = loadJSON("bar.js");
}
我猜问题在于如何在loadJSON()
函数中使用return:
function loadJSON(url){
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
return JSON.parse(xhr.responseText); // doesn't work?
}
}
xhr.open("GET", url, true);
xhr.send();
return xhr.onreadystatechange;
}
$(document).ready(function(){
initSession();
});
function success(){
$("body").append(foo[0]);
$("body").append(bar[0]);
}
谢谢大家! 您可以尝试以下方法:
$(document).ready(function(){
loadJSON("foo.js");
loadJSON("bar.js");
});
loadJSON("foo.js", function(data){
// do something with data
});
修改您的success
功能:
function success(data){
$("body").append(data[0]);
}
然后在success回调/onreadystatechange中修改
if(xhr.readyState == 4 && xhr.status == 200){
success(JSON.parse(xhr.responseText));
}
从success callback/onreadystatechange
函数调用success
函数。您还可以将回调函数传递给loadJSON
函数,并可以从onreadystatechange/success回调调用callback
函数,例如:
function loadJSON(url, callback){
// ...
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
callback(JSON.parse(xhr.responseText));
}
}
// ...
}
然后您可以像这样传递回调函数:
$(document).ready(function(){
loadJSON("foo.js");
loadJSON("bar.js");
});
loadJSON("foo.js", function(data){
// do something with data
});
因此,您可以对不同的ajax
请求使用不同的回调函数。。。以下是我根据已接受答案中的讨论得出的最终解决方案。这将很容易允许扩展在调用success函数之前动态设置文件数
var foo;
var bar;
var count = 0;
function initSession(){
loadJSON("foo.js", "foo");
loadJSON("bar.js", "bar");
}
function loadJSON(url, name){
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
count++;
window[name] = JSON.parse(xhr.responseText);;
if (count == 2){
success();
}
}
}
xhr.open("GET", url, true);
xhr.send();
}
$(document).ready(function(){
initSession();
});
function success(){
$("body").append(foo[0].option + "<br>" + bar[0].fname + " " + bar[0].lname);
}
var-foo;
var-bar;
var计数=0;
函数initSession(){
loadJSON(“foo.js”、“foo”);
loadJSON(“bar.js”,“bar”);
}
函数loadJSON(url、名称){
var xhr=new XMLHttpRequest();
xhr.onreadystatechange=函数(){
如果(xhr.readyState==4&&xhr.status==200){
计数++;
window[name]=JSON.parse(xhr.responseText);;
如果(计数=2){
成功();
}
}
}
xhr.open(“GET”,url,true);
xhr.send();
}
$(文档).ready(函数(){
initSession();
});
函数success(){
$(“body”).append(foo[0].option+“
”+bar[0].fname+”“+bar[0].lname);
}
return JSON.parse(xhr.responseText)
不起作用,因为它是异步的,您可以在回调函数usinfvarname=JSON.parse(xhr.responseText)
中将结果分配到一个全局变量中,但这可能无法解决问题。因此,只有在设置了foo和bar之后,我才能调用success(),这很有效。。。但我的想法是,在foo和bar的readyState都达到4之前,我不想加载success…在返回数据后,success
global函数将一次调用一次,因此不会有问题。我想我可能没有正确理解您。。。我不想一次只说一次成功。我只想叫它一次。加载后,两个文件的JSON()都已完成。如果只想调用一次success,则可以保留/存储返回的对变量的响应,而不是从onreadystatechange
调用success。在第二次成功调用ajax
时,调用success
函数。很高兴您找到了它:-),这对我不管用!我只是替换了URL,结果仍然没有定义