如何处理同时的javascript xmlhttprequests?

nik*_*las 5 javascript xmlhttprequest simultaneous-calls

可能重复:
将索引从for循环传递给ajax回调函数(javascript)

为了获取一些内容,我一直对将xmlhttprequests制作到不同的服务器感到困惑.这是我写的,但似乎我在某些方面弄错了..

var URL = new Array();
URL[0] = "http://www.example1.com";
URL[1] = "http://www.example2.com";
URL[2] = "http://www.example3.com";
var nRequest = new Array();
for (var i=0; i<3; i++) {
    nRequest[i] = new XMLHttpRequest();
    nRequest[i].open("GET", URL[i], true);
    nRequest[i].onreadystatechange = function (oEvent) {
        if (nRequest[i].readyState === 4) {
            if (nRequest[i].status === 200) {
                console.log(nRequest[i].responseText);
                alert(nRequest[i].responseText);
            } else {
                console.log("Error", nRequest[i].statusText);
            }
        }
    };
    nRequest[i].send(null);
}
Run Code Online (Sandbox Code Playgroud)

在IE10上使用此代码我在控制台上被拒绝访问..

如果我删除数组并使用简单的请求,它按预期运行..

wRequest = new XMLHttpRequest();
wRequest.open("GET", "http://www.example1.com", true);
wRequest.onreadystatechange = function (oEvent) {
    if (wRequest.readyState === 4) {
        if (wRequest.status === 200) {
            console.log(wRequest.responseText);
            alert(wRequest.responseText);
        } else {
            console.log("Error", wRequest.statusText);
        }
    }
};
wRequest.send(null);
Run Code Online (Sandbox Code Playgroud)

但是我怎么能触发多个2-3个请求,而且数据处理仍然没有问题.??

nnn*_*nnn 13

问题(忽略了slebetman所涵盖的跨域问题)是当你的就绪状态改变回调被触发时,它正在使用i来自包含范围的变量,该变量将3在循环完成之后.解决这个问题的一种方法如下:

for (var i=0; i<3; i++){
   (function(i) {
      nRequest[i] = new XMLHttpRequest();
      nRequest[i].open("GET", URL[i], true);
      nRequest[i].onreadystatechange = function (oEvent) {
         if (nRequest[i].readyState === 4) {
            if (nRequest[i].status === 200) {
              console.log(nRequest[i].responseText);
              alert(nRequest[i].responseText);
            } else {
              console.log("Error", nRequest[i].statusText);
            }
         }
      };
      nRequest[i].send(null);
   })(i);
}
Run Code Online (Sandbox Code Playgroud)

这为每个循环迭代引入了一个立即调用的函数表达式,使得函数内部的代码具有自己的代码i- JS闭包的魔力意味着当onreadystatechange调用函数时它将访问i匿名函数的参数(即使该函数已完成) ),而不是i外部范围,因此nRequest每次都会处理正确的元素.

你也.open()说过你wURL[i]应该说的那条线路上有一个拼写错误URL[i].

根据您计划对响应文本执行的操作,我不确定您是否需要一组请求:您可以将Ajax代码封装到一个函数中,该函数将URL和回调函数作为参数,然后调用循环中的功能......