nik*_*las 5 javascript xmlhttprequest simultaneous-calls
为了获取一些内容,我一直对将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和回调函数作为参数,然后调用循环中的功能......
| 归档时间: |
|
| 查看次数: |
11623 次 |
| 最近记录: |