如何处理JavaScript的同时XMLHttpRequest的? [重复](How to ha

2019-07-03 22:31发布

可能重复:
使索引从for循环到AJAX回调函数(JavaScript的)

我一直有点困惑与制作的XMLHttpRequest,到不同的服务器,以获取一些内容。这里是我写的是什么,但似乎我在某些时候弄错..

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);
}

与此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);

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

Answer 1:

问题(忽略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);
}

这引入了每个循环的立即调用的函数表达式迭代使得函数内的代码都有自己的i - JS关闭的神奇意味着当onreadystatechange函数被调用时,它将访问参数i的匿名函数(即使该功能已经完成),而不是i的外部范围,所以右nRequest元件将每次处理。

你也有对一个错字.open()行,你说wURL[i]但应该已经有URL[i]

根据您计划使用响应文本我不知道,你需要请求的数组都做什么:你可以封装Ajax代码到,需要一个URL和一个回调函数作为参数的函数,然后调用功能在环...



Answer 2:

做的XMLHttpRequest,到不同的服务器

你不能这样做。 XMLHttpRequest的只允许连接到该网页属于同一个域。 这就是所谓的“同源策略”。

谷歌“同源策略”或在这里寻找它的SO了解更多信息。



文章来源: How to handle Simultaneous javascript xmlhttprequests? [duplicate]