Javascript 使用异步XMLHttpRequest加载XML文件数组
我想加载一个XML文件数组,并将它们存储在一个数组中 代码示例:Javascript 使用异步XMLHttpRequest加载XML文件数组,javascript,ajax,anonymous-function,Javascript,Ajax,Anonymous Function,我想加载一个XML文件数组,并将它们存储在一个数组中 代码示例: var src = [ "a", "b", "c", "d" ]; var dest = {}; for (var i in src) { var req = new XMLHttpRequest(); req.open("GET", src[i], true); req.onreadystatechange = function(aEvt) { if (req.readyState ==
var src = [ "a", "b", "c", "d" ];
var dest = {};
for (var i in src) {
var req = new XMLHttpRequest();
req.open("GET", src[i], true);
req.onreadystatechange = function(aEvt) {
if (req.readyState == 4) {
if (req.status == 200) {
dump(i + "\n");
dest[i] = req.responseXML;
}
}
}
req.send(null);
}
但是,转储结果总是
三,
三,
三,
三,
它表明回调中引用的i
始终是外部i
,因此无法正确存储XML文件
那么,如何解决这个问题呢?我们有大约50个XML文件要加载,不能一个一个地加载它们
谢谢。您可以这样做:
var src = [ "a", "b", "c", "d" ];
var dest = {};
var loadXml = function(i) {
var req = new XMLHttpRequest();
req.open("GET", xmlfile, true);
req.onreadystatechange = function(aEvt) {
if (req.readyState == 4) {
if (req.status == 200) {
dump(i + "\n");
dest[i] = req.responseXML;
}
}
}
req.send(null);
};
for (var x = 0; x < src.length; x++) {
loadXml(x);
}
var src=[“a”、“b”、“c”、“d”];
var dest={};
var loadXml=函数(i){
var req=新的XMLHttpRequest();
请求打开(“GET”,xmlfile,true);
req.onreadystatechange=功能(aEvt){
如果(req.readyState==4){
如果(请求状态==200){
转储(i+“\n”);
dest[i]=req.responseXML;
}
}
}
请求发送(空);
};
对于(var x=0;x
顺便说一句,您似乎总是加载同一个XML文件,但我确信这与实际代码不同;) 您可以这样做:
var src = [ "a", "b", "c", "d" ];
var dest = {};
var loadXml = function(i) {
var req = new XMLHttpRequest();
req.open("GET", xmlfile, true);
req.onreadystatechange = function(aEvt) {
if (req.readyState == 4) {
if (req.status == 200) {
dump(i + "\n");
dest[i] = req.responseXML;
}
}
}
req.send(null);
};
for (var x = 0; x < src.length; x++) {
loadXml(x);
}
var src=[“a”、“b”、“c”、“d”];
var dest={};
var loadXml=函数(i){
var req=新的XMLHttpRequest();
请求打开(“GET”,xmlfile,true);
req.onreadystatechange=功能(aEvt){
如果(req.readyState==4){
如果(请求状态==200){
转储(i+“\n”);
dest[i]=req.responseXML;
}
}
}
请求发送(空);
};
对于(var x=0;x
顺便说一句,您似乎总是加载同一个XML文件,但我确信这与实际代码不同;)
for..来循环数组。对
循环使用正常的
i
将始终引用您循环的数组的最后一个元素。它们都引用了相同的i
。您可以通过使用一个立即执行的函数来解决这个问题,该函数返回一个函数(因此,捕获i
的值)req
的引用,否则它将始终引用最后生成的XMLHttpRequest(与i
的原因相同)var src = [ "a", "b", "c", "d" ];
var dest = {};
for (var i = src.length;i--;) {
var req = new XMLHttpRequest();
req.open("GET", xmlfile, true);
req.onreadystatechange = (function(i, req) {
return function(aEvt) {
if (req.readyState == 4) {
if (req.status == 200) {
dump(i + "\n");
dest[i] = req.responseXML;
}
}
};
}(i, req)); // capturing the current value/reference of i and req
req.send(null);
}
@斯皮尼·诺曼的解决方案可能更具可读性;)
for..来循环数组。对
循环使用正常的
i
将始终引用您循环的数组的最后一个元素。它们都引用了相同的i
。您可以通过使用一个立即执行的函数来解决这个问题,该函数返回一个函数(因此,捕获i
的值)req
的引用,否则它将始终引用最后生成的XMLHttpRequest(与i
的原因相同)var src = [ "a", "b", "c", "d" ];
var dest = {};
for (var i = src.length;i--;) {
var req = new XMLHttpRequest();
req.open("GET", xmlfile, true);
req.onreadystatechange = (function(i, req) {
return function(aEvt) {
if (req.readyState == 4) {
if (req.status == 200) {
dump(i + "\n");
dest[i] = req.responseXML;
}
}
};
}(i, req)); // capturing the current value/reference of i and req
req.send(null);
}
@斯皮尼·诺曼的解决方案可能更具可读性;) 非常感谢,但我认为Felix Kling的解决方案是正确的,因为它有更多的解释。堆栈溢出中最好的答案之一。。。。。。我们有没有办法取消所有的请求。。。我的意思是,如果for循环运行100次,是否有任何方法(比如在UI上单击某个按钮)停止/中止其他仍在运行的请求。。。非常感谢,但我认为Felix Kling的解决方案是正确的,因为它有更多的解释。堆栈溢出中最好的答案之一。。。。。。我们有没有办法取消所有的请求。。。我的意思是,如果for循环运行100次,是否有任何方法(比如在UI上单击某个按钮)停止/中止其他仍在运行的请求。。。谢谢。。。。但是如果我的for循环迭代了很多次(比如说20次),并且每个都是网络请求,那么我如何才能真正删除/关闭所有其他线程……太好了。。。。但是如果我的for循环迭代了很多次(比如说20次),并且每个都是网络请求,那么我如何才能真正删除/关闭所有其他线程。。。