Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用异步XMLHttpRequest加载XML文件数组_Javascript_Ajax_Anonymous Function - Fatal编程技术网

Javascript 使用异步XMLHttpRequest加载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 ==

我想加载一个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 == 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..来循环数组。对
    循环使用正常的
  • 在循环中创建函数是一个典型的错误。JavaScript没有块作用域,只有函数作用域,因此当您创建的函数被执行时,
    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..来循环数组。对
    循环使用正常的
  • 在循环中创建函数是一个典型的错误。JavaScript没有块作用域,只有函数作用域,因此当您创建的函数被执行时,
    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次),并且每个都是网络请求,那么我如何才能真正删除/关闭所有其他线程。。。