我之前已经问过这个问题,但是我尝试应用答案而没有结果。
我正在尝试使用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);
}
我没看到我做错了什么。
答案 0 :(得分:0)
您的第二次尝试相当接近,但您需要为IIFE内的每个请求创建一个单独的 XMLHttpRequest
对象,请参阅重新定位的行***
评论:
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
)。
附注:不确定区间计时器的用途是什么,所以我已将其留下,但您的onreadystatechange
处理程序将被调用,无需备份用计时器。