5

可能重复:
将索引从 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);
}

使用 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 个请求,并且仍然没有数据处理问题..?

4

2 回答 2

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

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

.open()此外,您在说wURL[i]但应该有的行上有错字URL[i]

根据您打算如何处理响应文本,我不确定您是否需要一组请求:您可以将 Ajax 代码封装到一个函数中,该函数将 URL 和回调函数作为参数,然后调用它循环中的函数...

于 2012-11-18T23:50:47.550 回答
1

不同的服务器发出 xmlhttprequests

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

谷歌“同源政策”或在 SO 上搜索以了解更多信息。

于 2012-11-18T23:50:18.220 回答