2012-11-18 46 views
5

可能重复:
passing index from for loop to ajax callback function (javascript)如何处理同时的javascript xmlhttprequests?

我去过有点困惑与制作的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); 
} 

但IMI应该如何触发多个2-3的请求,仍然没有与数据问题处理??

+3

您不能使用AJAX从不同的域读取数据。 – SLaks

+0

我看到一个错字'wURL' - >'URL',一个关闭问题'i'在匿名函数和相同的原始策略问题中。 – Musa

+0

为什么我只从一个域获取数据? – nikolas

回答

11

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

做了伎俩.. !!!最近我有问题的另一个案件与JS的范围,似乎我再次面对它......非常感谢你.. !!! – nikolas

+0

不客气。我所展示的是对现有代码进行微小更改以使其可行,但是(在我看来)有更好的方法来构造整个事物 - 可能超出了这个问题的范围。 – nnnnnn

+0

错字,只是尝试代码显得友好,比我原来的变量名称处理...至于我的答复文本,即时通讯只是试图做一个混搭应用程序,从2-3个不同的网站收集数据,并收集一些特定的信息从每个..这就是为什么我认为这将是更好的使用阵列.. – nikolas

0

做的XMLHttpRequest,到不同的服务器

你不能做到这一点。 XMLHttpRequest只允许连接到页面所属的同一个域。这被称为“同源策略”

谷歌“同源策略”或在SO搜索它了解更多。

+0

谢谢你的回应,但是,由于某种原因,我确实得到了回应,当我触发单一的请求.. – nikolas