如何处理同时的javascript xmlhttprequests?

时间:2012-11-18 23:41:02

标签: javascript xmlhttprequest simultaneous-calls

  

可能重复:
  passing index from for loop to ajax callback function (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);
}

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

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

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

2 个答案:

答案 0 :(得分: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和回调函数作为参数,并且然后在循环中调用该函数......

答案 1 :(得分:0)

  

将xmlhttprequests发送到不同的服务器

你做不到。 XMLHttpRequest仅允许连接到页面所属的同一域。这称为“同源政策”

Google“同源政策”或在此处搜索,以了解详情。