我知道这个问题以前曾问过,但我试图应用答案而没有结果。
我正在尝试使用for
循环在同一域上执行多个请求,但它仅适用于我的数组的最后一个记录。当我只尝试一个请求时,它可以正常工作。我不明白。
这是我使用的代码:
var xhr = new XMLHttpRequest();
var idArray = ['1', '2', '3', '4', '5'];
for(var i = 0;i < idArray.length;i++) {
xhr.open('PUT', 'https://www.domain.com/url/' + idArray[i]);
xhr.setRequestHeader('Authorization', authorizationToken);
xhr.send(null);
var test = setInterval(function () {
if(xhr.readyState != 4) {
//someCode
} else {
clearInterval(test);
}
}, 1000);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if(xhr.status != 200) {
//someCode
}
}
}
}
我也尝试过,但仍然没有结果:
var xhr = new XMLHttpRequest();
var idArray = ['1', '2', '3', '4', '5'];
for(var i = 0;i < idArray.length;i++) {
(function(i) {
xhr.open('PUT', 'https://www.domain.com/url/' + idArray[i]);
xhr.setRequestHeader('Authorization', authorizationToken);
xhr.send(null);
var test = setInterval(function () {
if(xhr.readyState != 4) {
//someCode
} else {
clearInterval(test);
}
}, 1000);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if(xhr.status != 200) {
//someCode
}
}
}
})(i);
}
我没有看到我在做什么错。
您的第二次尝试相当接近,但是您需要为每个 em XMLHttpRequest
对象创建请求,在IIFE中,请参阅带有***
评论的重新定位行:
var idArray = ['1', '2', '3', '4', '5'];
for(var i = 0;i < idArray.length;i++) {
(function(i) {
var xhr = new XMLHttpRequest(); // ***
xhr.open('PUT', 'https://www.domain.com/url/' + idArray[i]);
xhr.setRequestHeader('Authorization', authorizationToken);
xhr.send(null);
var test = setInterval(function () {
if(xhr.readyState != 4) {
//someCode
} else {
clearInterval(test);
}
}, 1000);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if(xhr.status != 200) {
//someCode
}
}
}
})(i);
}
从技术上讲,由于您在那里创建的回调中不使用i
,因此您不需要将i
传递给IIFE(但是您确实需要IIFE)您有单独的 xhr
s)。
旁注:不确定间隔计时器是什么,所以我已经离开了,但是您的onreadystatechange
Handler Will 无需用计时器来支持它。