Javascript XMLHttpRequest in for loop



我知道这个问题以前曾问过,但我试图应用答案而没有结果。

我正在尝试使用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 无需用计时器来支持它。

最新更新