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)
不起作用,因为它是异步的,您可以在回调函数usinf
varname=JSON.parse(xhr.responseText)
中将结果分配到一个全局变量中,但这可能无法解决问题。因此,只有在设置了foo和bar之后,我才能调用success(),这很有效。。。但我的想法是,在foo和bar的readyState都达到4之前,我不想加载success…在返回数据后,
success
global函数将一次调用一次,因此不会有问题。我想我可能没有正确理解您。。。我不想一次只说一次成功。我只想叫它一次。加载后,两个文件的JSON()都已完成。如果只想调用一次success,则可以保留/存储返回的对变量的响应,而不是从
onreadystatechange
调用success。在第二次成功调用
ajax
时,调用
success
函数。很高兴您找到了它:-),这对我不管用!我只是替换了URL,结果仍然没有定义